我有以下存储过程,它接收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()
$result = $s3->uploadPart(array(
'Bucket' => $as3_bucket,
'Key' => $as3_file,
'UploadId' => $uploadId,
'PartNumber' => $partNumber,
'Body' => fread($file, 5 * 1024 * 1024),
));
从对象类型System.Data.DataSet到已知的对象类型不存在任何映射 托管提供商本机类型。
答案 0 :(得分:4)
您无法参数化您的表名,基本上。
参数化SQL仅用于值 - 而不是表名,列名或任何其他数据库对象。这是您可能想要动态构建SQL的地方 - 但是在将此表名放入sql查询之前,使用白名单选项或强验证。
那条线;
cmd.Parameters.AddWithValue("@tblInvoice", ds);
您尝试将DataSet
传递给您的桌面名称,这是没有意义的。
答案 1 :(得分:4)
您无法将数据集传递给存储过程,但可以将数据表传递给存储过程。按照以下算法执行:
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.
这仅限制您的表类型参数序列和数据表列序列应该相同。