2015-06-05 2 views
0

У меня есть следующая Хранимая процедура, которая принимает параметр 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(); 
        } 
       } 
      } 

Когда я выполняю его, он бросает ArgumentException на cmd.ExecuteNonQuery()

отображение не существует от типа объекта System.Data .DataSet к известному управляемому собственному типу поставщика.

+0

Что происходит, когда вы выполняете это? –

+0

Я обновил сообщение. – Nuke

+0

Табличные параметры работают с DataTables, а не с DataSets. Передайте таблицу набора данных как значение параметра –

ответ

2

Вы не можете передавать данные в хранимую процедуру, но можете передавать данные в хранимую процедуру. Следуйте ниже алгоритма для его выполнения:

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 последовательность колонки должны быть одинаковыми.

Вы можете сослаться на эту ссылку Sending a DataTable to a Stored Procedure

Или Table-Valued Parameters

4

Вы не можете параметризовать название своей таблицы, в основном.

Параметрированный SQL предназначен только для значений - не имена таблиц, имена столбцов или любые другие объекты базы данных. Это одно место, где вы, вероятно, захотите построить SQL динамически - но с набором опций с белым списком или сильной проверкой перед тем, как поместить это имя таблицы в свой SQL-запрос.

Это что линия;

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

Вы пытаетесь передать свой DataSet к вашему имени таблицы, которая не имеет смысла.

+0

Умм вы можете объяснить свой ответ кодом? – Nuke

+2

@Nuke TVPs работают с datatables, а не наборами данных. Передайте данные, которые вы хотите, в качестве значения параметра –

Смежные вопросы