簡體   English   中英

將DataSet傳遞給存儲過程

[英]Passing DataSet to Stored Procedure

我有以下存儲過程,它接收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到已知的托管提供程序本機類型不存在映射。

基本上 ,您無法參數化表名。

參數化SQL僅用於值 - 而不是表名,列名或任何其他數據庫對象。 這是您可能想要動態構建SQL的地方 - 但是在將此表名放入sql查詢之前,使用白名單選項或強驗證。

那條線;

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

您嘗試將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.

這僅限制您的表類型參數序列和數據表列序列應該相同。

您可以參考此鏈接將DataTable發送到存儲過程

表值參數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM