将数据集传递给存储过程

本文关键字:存储过程 数据集 | 更新日期: 2023-09-27 17:53:28

我有以下存储过程,它接收DataSet作为参数并插入到表Excel中。

CREATE PROCEDURE spInsertInvoice
      @tblInvoice InvoiceType READONLY
AS
BEGIN
      SET NOCOUNT ON;
      INSERT INTO Excel
      SELECT Template, Cust_Name, Invoice_No,InvoiceDate FROM @tblInvoice
END

在我的代码文件中,我试图读取Excel Sheet并填充数据集。但问题是我有点困惑,我应该如何将DataSet作为Parameter发送到stored Procedure。这就是我到目前为止所尝试的,但它似乎不起作用

if (FileUpload1.HasFile)
        {
            string path = string.Concat((Server.MapPath("~/temp/" + FileUpload1.FileName)));
            FileUpload1.PostedFile.SaveAs(path);
            OleDbConnection oleCon = new OleDbConnection("Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" + path + ";Extended Properties = Excel 12.0;");
            OleDbCommand Olecmd = new OleDbCommand("select * from [Sheet1$]", oleCon);
            OleDbDataAdapter dtap = new OleDbDataAdapter(Olecmd);
            DataSet ds = new DataSet();
            dtap.Fill(ds);
            GridView1.DataSource = ds;
            GridView1.DataBind();
            if (ds.Tables[0].Rows.Count > 0)
            {
                string consString = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
                using (SqlConnection con = new SqlConnection(consString))
                {
                    using (SqlCommand cmd = new SqlCommand("spInsertInvoice"))
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Connection = con;
                        cmd.Parameters.AddWithValue("@tblInvoice", ds);
                        con.Open();
                        cmd.ExecuteNonQuery();
                        con.Close();
                    }
                }
            }

当我执行它时,它会在cmd.ExecuteNonQuery()上抛出ArgumentException

不存在从对象类型System.Data.DataSet到已知托管提供程序本机类型。

将数据集传递给存储过程

不能将数据集传递给存储过程,但可以将数据表传递给存储过程。按照下面的算法执行:

1) Create Table type in sql server for the DataTable which you want to pass.
2) Declare input variable for given table type as readonly in stored procedure.
3) Pass that data table to procedure.

这只限制你的表类型参数序列和数据表列序列应该相同。

你可以参考这个链接发送数据表到存储过程

或表值参数

你不能参数化你的表名,基本上

参数化SQL只处理值,而不处理表名、列名或任何其他数据库对象。这是一个您可能想要动态构建SQL的地方-但是在将此表名称放入SQL查询之前,要使用一组白名单选项或强验证。

cmd.Parameters.AddWithValue("@tblInvoice", ds);

您试图将您的DataSet传递给您的表名,这是没有意义的