【问题标题】:Passing DataSet to Stored Procedure将数据集传递给存储过程
【发布时间】:2015-08-20 06:52:57
【问题描述】:

我有以下存储过程,它接收 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 到已知的映射 托管提供程序本机类型。

【问题讨论】:

  • 执行此操作会发生什么?
  • 我已经更新了帖子。
  • 表值参数适用于 DataTables,而不是 DataSets。将数据集的表作为参数值传递

标签: c# sql-server stored-procedures dataset


【解决方案1】:

您无法将数据集传递给存储过程,但您可以通过DataTable到存储过程。遵循以下算法来执行它:

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.

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

您可以参考此链接Sending a DataTable to a Stored Procedure

Table-Valued Parameters

【讨论】:

    【解决方案2】:

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

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

    那一行;

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

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

    【讨论】:

    • @Nuke TVP 使用数据表,而不是数据集。将你想要的数据表作为参数值传递
    猜你喜欢
    • 2012-09-01
    • 2016-04-27
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多