C# 插入错误:提供的值的列名或数目与表定义不匹配。正在使用StoredProcess
我发现以下错误: 插入错误:提供的值的列名或数目不匹配 表定义 excel中的总列数=17 表中的字段总数=17+3=20 在3个字段中,1个是(primarykeyid自动生成),2个是(将从另一个文本框获取),3个是(默认值1) 我不知道如何将文本框值和默认值传递给过程 请给我建议一条路 这是我的存储过程代码C# 插入错误:提供的值的列名或数目与表定义不匹配。正在使用StoredProcess,c#,sql-server-2008,stored-procedures,C#,Sql Server 2008,Stored Procedures,我发现以下错误: 插入错误:提供的值的列名或数目不匹配 表定义 excel中的总列数=17 表中的字段总数=17+3=20 在3个字段中,1个是(primarykeyid自动生成),2个是(将从另一个文本框获取),3个是(默认值1) 我不知道如何将文本框值和默认值传递给过程 请给我建议一条路 这是我的存储过程代码 USE [Demo] GO /****** Object: StoredProcedure [dbo].[spx_ImportFromExcel07] Script Date:
USE [Demo]
GO
/****** Object: StoredProcedure [dbo].[spx_ImportFromExcel07] Script Date: 03/21/2014 18:25:49 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[spx_ImportFromExcel07]
@SheetName varchar(20),
@FilePath varchar(300),
@HDR varchar(3),
@TableName varchar(50)
AS
BEGIN
DECLARE @SQL nvarchar(1000)
IF OBJECT_ID (@TableName,'U') IS NOT NULL
SET @SQL = 'INSERT INTO ' + @TableName + ' SELECT * FROM OPENDATASOURCE'
ELSE
SET @SQL = 'SELECT * INTO ' + @TableName + ' FROM OPENDATASOURCE'
SET @SQL = @SQL + '(''Microsoft.ACE.OLEDB.12.0'',''Data Source='
SET @SQL = @SQL + @FilePath + ';Extended Properties=''''Excel 12.0;HDR='
SET @SQL = @SQL + @HDR + ''''''')...['
SET @SQL = @SQL + @SheetName + ']'
EXEC sp_executesql @SQL
END
这是我的插入代码:
protected void btnSave_Click(object sender, EventArgs e)
{
string FileName = lblFileName.Text;
string Extension = Path.GetExtension(FileName);
string FolderPath = Server.MapPath(ConfigurationManager.AppSettings["FolderPath"]);
string CommandText = "";
switch (Extension)
{
case ".xls": //Excel 97-03
CommandText = "spx_ImportFromExcel03";
break;
case ".xlsx": //Excel 07
CommandText = "spx_ImportFromExcel07";
break;
}
//insertDB();
String strConnString = ConfigurationManager.ConnectionStrings["CARGONETConnectionString"].ConnectionString;
SqlConnection con = new SqlConnection(strConnString);
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = CommandText;
cmd.Parameters.Add("@SheetName", SqlDbType.VarChar).Value = ddlSheets.SelectedItem.Text;
cmd.Parameters.Add("@FilePath", SqlDbType.VarChar).Value = FolderPath + FileName;
cmd.Parameters.Add("@HDR", SqlDbType.VarChar).Value = rbHDR.SelectedItem.Text;
cmd.Parameters.Add("@TableName", SqlDbType.VarChar).Value = "TB_TransAgentSeaFreightRate";
cmd.Connection = con;
try
{
con.Open();
object count = cmd.ExecuteNonQuery();
lblMessage.ForeColor = System.Drawing.Color.Green;
lblMessage.Text = count.ToString() + " records inserted.";
}
catch (Exception ex)
{
lblMessage.ForeColor = System.Drawing.Color.White;
lblMessage.Text = ex.Message;
}
finally
{
con.Close();
con.Dispose();
Panel1.Visible = true;
//Panel2.Visible = false;
dg_AgentSFR.Visible = true;
}
}
请帮帮我
我不知道如何将textbox值和defaulvalue传递到StoredProcess
首先,我建议您去掉存储过程中的动态SQL。动态SQL将使您容易受到SQL注入的攻击。“lblFileName.Text”是我在提供的代码中看到的最有可能发生注入的地方,但是按照存储过程的编写方式,每个参数都有漏洞。在调用存储过程之前,应该将值解析为正确的类型。存储过程中的参数应分别为表中列的类型。至于你正在做的表格选择,问问你自己这会多久改变一次 如果由于表的数量太多而无法为每个表编写插入,则需要检查存储过程的参数以进行SQL注入 如果需要默认值,可以轻松地将其放在存储过程中。然后,您可以执行检查并跳过代码隐藏中的参数 存储过程:
CREATE PROCEDURE spExample
@nExample int = 1
AS
代码隐藏:
int value
if(int.TryParse(TextBox1.Text, out value))
{
// add parameter here.
}
如果我理解正确,您只需向存储过程中添加其他参数,然后在
btnSave\u Click()
方法中传递这些值。