Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 插入错误:提供的值的列名或数目与表定义不匹配。正在使用StoredProcess_C#_Sql Server 2008_Stored Procedures - Fatal编程技术网

C# 插入错误:提供的值的列名或数目与表定义不匹配。正在使用StoredProcess

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:

我发现以下错误:

插入错误:提供的值的列名或数目不匹配 表定义

excel中的总列数=17 表中的字段总数=17+3=20 在3个字段中,1个是(primarykeyid自动生成),2个是(将从另一个文本框获取),3个是(默认值1)

我不知道如何将文本框值和默认值传递给过程

请给我建议一条路

这是我的存储过程代码

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()
方法中传递这些值。