C# 将数据集传递给存储过程

C# 将数据集传递给存储过程,c#,sql-server,stored-procedures,dataset,C#,Sql Server,Stored Procedures,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

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表
,并填充数据集。但问题是我有点困惑,我该如何将
数据集
作为
参数
发送到
存储过程
。 这是我迄今为止尝试过的,但似乎不起作用

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()

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


基本上,您不能参数化表名

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

它是那条线

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

您试图将您的
数据集
传递给您的表名,这是没有意义的。

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

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.
这仅限制表类型参数序列和datatable列序列应相同

你可以参考这个链接


或者

执行此操作时会发生什么?我已经更新了post。表值参数用于数据表,而不是数据集。将数据集的表作为参数传递value@NukeTVP使用的是数据表,而不是数据集。将所需的数据表作为参数值传递