C# 过程或函数AppendDataCT指定的参数太多

C# 过程或函数AppendDataCT指定的参数太多,c#,dictionary,sql-server-2005,visual-studio-2008,C#,Dictionary,Sql Server 2005,Visual Studio 2008,我正在开发一个C#VS 2008/SQL Server网站应用程序。我是ASP.NET的新手。我得到上面的编译器错误。你能给我一些关于如何解决这个问题的建议吗 代码段: public static string AppendDataCT(DataTable dt, Dictionary<int, string> dic) { string connString = ConfigurationManager.ConnectionStrings["AW3_

我正在开发一个C#VS 2008/SQL Server网站应用程序。我是ASP.NET的新手。我得到上面的编译器错误。你能给我一些关于如何解决这个问题的建议吗

代码段:

    public static string AppendDataCT(DataTable dt, Dictionary<int, string> dic)
    {
        string connString = ConfigurationManager.ConnectionStrings["AW3_string"].ConnectionString;
        string errorMsg;

        try
        {
SqlConnection conn2 = new SqlConnection(connString);
SqlCommand cmd = conn2.CreateCommand();
cmd.CommandText = "dbo.AppendDataCT";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn2;
SqlParameter p1, p2, p3;
foreach (string s in dt.Rows[1].ItemArray)
{
    DataRow dr = dt.Rows[1]; // second row
    p1 = cmd.Parameters.AddWithValue((string)dic[0], (string)dr[0]);
    p1.SqlDbType = SqlDbType.VarChar;
    p2 = cmd.Parameters.AddWithValue((string)dic[1], (string)dr[1]);
    p2.SqlDbType = SqlDbType.VarChar;
    p3 = cmd.Parameters.AddWithValue((string)dic[2], (string)dr[2]);
    p3.SqlDbType = SqlDbType.VarChar;
}

conn2.Open();
cmd.ExecuteNonQuery();

如果项目数组包含多个字符串,则会发生这种情况,因为您将在项目数组中设置多个参数=3*无字符串

此外,您没有在循环中使用要拉出的字符串s

这里似乎发生了一些变化

您需要坐下来考虑是否要多次执行insert(现在您只执行一次)

还有其他方法可以设置参数的类型,所以您不需要p1,2,3变量

我怀疑你想做更像这样的事情

    public static string AppendDataCT(DataRow dr, Dictionary<int, string> dic) 
        { 


            string connString = ConfigurationManager.ConnectionStrings["AW3_string"].ConnectionString; 
            string errorMsg; 

            try
            {
                SqlConnection conn2 = new SqlConnection(connString);
                SqlCommand cmd = conn2.CreateCommand();
                cmd.CommandText = "dbo.AppendDataCT";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = conn2;
                SqlParameter p1, p2, p3;

                    p1 = cmd.Parameters.AddWithValue((string) dic[0], (string) dr[0]);
                    p1.SqlDbType = SqlDbType.VarChar;
                    p2 = cmd.Parameters.AddWithValue((string) dic[1], (string) dr[1]);
                    p2.SqlDbType = SqlDbType.VarChar;
                    p3 = cmd.Parameters.AddWithValue((string) dic[2], (string) dr[2]);
                    p3.SqlDbType = SqlDbType.VarChar;
                    conn2.Open();
                    cmd.ExecuteNonQuery();
                    conn2.Close();

            }
/// <summary>
        /// 
        /// </summary>
        /// <param name="dic">key = param name, val = param value</param>
        /// <returns></returns>
        public static string AppendDataCT(Dictionary<string, string> dic) 
    { 

        if (dic.Count !=3 )
            throw new ArgumentOutOfRangeException("dic can only have 3 parameters");

        string connString = ConfigurationManager.ConnectionStrings["AW3_string"].ConnectionString; 
         // you probably want to do a string.IsNullOrEmpty(connString) and throw a ConfigurationException here is true to quickly identify this annoying bug ...


           using(SqlConnection conn2 = new SqlConnection(connString))
           {
            using( SqlCommand cmd = conn2.CreateCommand())
            {
            cmd.CommandText = "dbo.AppendDataCT";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = conn2;

            foreach (string s in dic.Keys)
            {                    
                SqlParameter  p = cmd.Parameters.AddWithValue(s, dic[s]);
                p.SqlDbType = SqlDbType.VarChar;
            }

            conn2.Open();
            cmd.ExecuteNonQuery();
            conn2.Close();
           }
           }
        }
真让我迷惑不解。。。我认为你在这里做错了什么——它没有告诉我你想做什么,而且看起来很困惑。再过6个月,你就不知道这是怎么回事了。此外,调用者可能会在许多方面行为不端,这些行为只会在运行时被捕获

为什么不直接输入一个int来说明循环会发生多少次呢

Id还对字典执行计数,以确认字典中有3项且只有3项,因为无论循环多少次,都将插入相同的3项

为什么不使用字典并使用参数名作为索引?还是将键列表作为字符串循环并以这种方式添加参数

像这样吗

    public static string AppendDataCT(DataRow dr, Dictionary<int, string> dic) 
        { 


            string connString = ConfigurationManager.ConnectionStrings["AW3_string"].ConnectionString; 
            string errorMsg; 

            try
            {
                SqlConnection conn2 = new SqlConnection(connString);
                SqlCommand cmd = conn2.CreateCommand();
                cmd.CommandText = "dbo.AppendDataCT";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = conn2;
                SqlParameter p1, p2, p3;

                    p1 = cmd.Parameters.AddWithValue((string) dic[0], (string) dr[0]);
                    p1.SqlDbType = SqlDbType.VarChar;
                    p2 = cmd.Parameters.AddWithValue((string) dic[1], (string) dr[1]);
                    p2.SqlDbType = SqlDbType.VarChar;
                    p3 = cmd.Parameters.AddWithValue((string) dic[2], (string) dr[2]);
                    p3.SqlDbType = SqlDbType.VarChar;
                    conn2.Open();
                    cmd.ExecuteNonQuery();
                    conn2.Close();

            }
/// <summary>
        /// 
        /// </summary>
        /// <param name="dic">key = param name, val = param value</param>
        /// <returns></returns>
        public static string AppendDataCT(Dictionary<string, string> dic) 
    { 

        if (dic.Count !=3 )
            throw new ArgumentOutOfRangeException("dic can only have 3 parameters");

        string connString = ConfigurationManager.ConnectionStrings["AW3_string"].ConnectionString; 
         // you probably want to do a string.IsNullOrEmpty(connString) and throw a ConfigurationException here is true to quickly identify this annoying bug ...


           using(SqlConnection conn2 = new SqlConnection(connString))
           {
            using( SqlCommand cmd = conn2.CreateCommand())
            {
            cmd.CommandText = "dbo.AppendDataCT";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = conn2;

            foreach (string s in dic.Keys)
            {                    
                SqlParameter  p = cmd.Parameters.AddWithValue(s, dic[s]);
                p.SqlDbType = SqlDbType.VarChar;
            }

            conn2.Open();
            cmd.ExecuteNonQuery();
            conn2.Close();
           }
           }
        }
//
/// 
/// 
///key=param name,val=param value
/// 
公共静态字符串AppendDataCT(字典dic)
{ 
如果(dic.Count!=3)
抛出新ArgumentOutOfRangeException(“dic只能有3个参数”);
string connString=ConfigurationManager.ConnectionString[“AW3_string”]。ConnectionString;
//您可能需要执行一个string.IsNullOrEmpty(connString)并抛出一个ConfigurationException,以便快速识别这个恼人的bug。。。
使用(SqlConnection conn2=新的SqlConnection(connString))
{
使用(SqlCommand cmd=conn2.CreateCommand())
{
cmd.CommandText=“dbo.AppendDataCT”;
cmd.CommandType=CommandType.storedProcess;
cmd.Connection=conn2;
foreach(dic.Keys中的字符串s)
{                    
SqlParameter p=cmd.Parameters.AddWithValue(s,dic[s]);
p、 SqlDbType=SqlDbType.VarChar;
}
conn2.Open();
cmd.ExecuteNonQuery();
conn2.Close();
}
}
}
这段代码远非完美,但可能正是你的意思

如果您确实想做多个插入,那么可以考虑<代码>列表< /代码>


或者更好的做法是制作一个简单的结构来保存参数,并有一个结构列表,然后将其传入。args使用struct/class的原因是,它可以使数据有效,以保护您的方法不受导致其爆炸的各种恶劣数据的影响。让其他人编写代码而不是处理他们所有的奇怪排列总是很好的。

如果项目数组包含多个字符串,则会发生这种情况,因为您将设置多个参数=3*项目数组中没有字符串

此外,您没有在循环中使用要拉出的字符串s

这里似乎发生了一些变化

您需要坐下来考虑是否要多次执行insert(现在您只执行一次)

还有其他方法可以设置参数的类型,所以您不需要p1,2,3变量

我怀疑你想做更像这样的事情

    public static string AppendDataCT(DataRow dr, Dictionary<int, string> dic) 
        { 


            string connString = ConfigurationManager.ConnectionStrings["AW3_string"].ConnectionString; 
            string errorMsg; 

            try
            {
                SqlConnection conn2 = new SqlConnection(connString);
                SqlCommand cmd = conn2.CreateCommand();
                cmd.CommandText = "dbo.AppendDataCT";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = conn2;
                SqlParameter p1, p2, p3;

                    p1 = cmd.Parameters.AddWithValue((string) dic[0], (string) dr[0]);
                    p1.SqlDbType = SqlDbType.VarChar;
                    p2 = cmd.Parameters.AddWithValue((string) dic[1], (string) dr[1]);
                    p2.SqlDbType = SqlDbType.VarChar;
                    p3 = cmd.Parameters.AddWithValue((string) dic[2], (string) dr[2]);
                    p3.SqlDbType = SqlDbType.VarChar;
                    conn2.Open();
                    cmd.ExecuteNonQuery();
                    conn2.Close();

            }
/// <summary>
        /// 
        /// </summary>
        /// <param name="dic">key = param name, val = param value</param>
        /// <returns></returns>
        public static string AppendDataCT(Dictionary<string, string> dic) 
    { 

        if (dic.Count !=3 )
            throw new ArgumentOutOfRangeException("dic can only have 3 parameters");

        string connString = ConfigurationManager.ConnectionStrings["AW3_string"].ConnectionString; 
         // you probably want to do a string.IsNullOrEmpty(connString) and throw a ConfigurationException here is true to quickly identify this annoying bug ...


           using(SqlConnection conn2 = new SqlConnection(connString))
           {
            using( SqlCommand cmd = conn2.CreateCommand())
            {
            cmd.CommandText = "dbo.AppendDataCT";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = conn2;

            foreach (string s in dic.Keys)
            {                    
                SqlParameter  p = cmd.Parameters.AddWithValue(s, dic[s]);
                p.SqlDbType = SqlDbType.VarChar;
            }

            conn2.Open();
            cmd.ExecuteNonQuery();
            conn2.Close();
           }
           }
        }
真让我迷惑不解。。。我认为你在这里做错了什么——它没有告诉我你想做什么,而且看起来很困惑。再过6个月,你就不知道这是怎么回事了。此外,调用者可能会在许多方面行为不端,这些行为只会在运行时被捕获

为什么不直接输入一个int来说明循环会发生多少次呢

Id还对字典执行计数,以确认字典中有3项且只有3项,因为无论循环多少次,都将插入相同的3项

为什么不使用字典并使用参数名作为索引?还是将键列表作为字符串循环并以这种方式添加参数

像这样吗

    public static string AppendDataCT(DataRow dr, Dictionary<int, string> dic) 
        { 


            string connString = ConfigurationManager.ConnectionStrings["AW3_string"].ConnectionString; 
            string errorMsg; 

            try
            {
                SqlConnection conn2 = new SqlConnection(connString);
                SqlCommand cmd = conn2.CreateCommand();
                cmd.CommandText = "dbo.AppendDataCT";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = conn2;
                SqlParameter p1, p2, p3;

                    p1 = cmd.Parameters.AddWithValue((string) dic[0], (string) dr[0]);
                    p1.SqlDbType = SqlDbType.VarChar;
                    p2 = cmd.Parameters.AddWithValue((string) dic[1], (string) dr[1]);
                    p2.SqlDbType = SqlDbType.VarChar;
                    p3 = cmd.Parameters.AddWithValue((string) dic[2], (string) dr[2]);
                    p3.SqlDbType = SqlDbType.VarChar;
                    conn2.Open();
                    cmd.ExecuteNonQuery();
                    conn2.Close();

            }
/// <summary>
        /// 
        /// </summary>
        /// <param name="dic">key = param name, val = param value</param>
        /// <returns></returns>
        public static string AppendDataCT(Dictionary<string, string> dic) 
    { 

        if (dic.Count !=3 )
            throw new ArgumentOutOfRangeException("dic can only have 3 parameters");

        string connString = ConfigurationManager.ConnectionStrings["AW3_string"].ConnectionString; 
         // you probably want to do a string.IsNullOrEmpty(connString) and throw a ConfigurationException here is true to quickly identify this annoying bug ...


           using(SqlConnection conn2 = new SqlConnection(connString))
           {
            using( SqlCommand cmd = conn2.CreateCommand())
            {
            cmd.CommandText = "dbo.AppendDataCT";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = conn2;

            foreach (string s in dic.Keys)
            {                    
                SqlParameter  p = cmd.Parameters.AddWithValue(s, dic[s]);
                p.SqlDbType = SqlDbType.VarChar;
            }

            conn2.Open();
            cmd.ExecuteNonQuery();
            conn2.Close();
           }
           }
        }
//
/// 
/// 
///key=param name,val=param value
/// 
公共静态字符串AppendDataCT(字典dic)
{ 
如果(dic.Count!=3)
抛出新ArgumentOutOfRangeException(“dic只能有3个参数”);
string connString=ConfigurationManager.ConnectionString[“AW3_string”]。ConnectionString;
//您可能需要执行一个string.IsNullOrEmpty(connString)并抛出一个ConfigurationException,以便快速识别这个恼人的bug。。。
使用(SqlConnection conn2=新的SqlConnection(connString))
{
使用(SqlCommand cmd=conn2.CreateCommand())
{
cmd.CommandText=“dbo.AppendDataCT”;
cmd.CommandType=CommandType.storedProcess;
cmd.Connection=conn2;
foreach(dic.Keys中的字符串s)
{                    
SqlParameter p=cmd.Parameters.AddWithValue(s,dic[s]);
p、 SqlDbType=SqlDbType.VarChar;
}
conn2.Open();
cmd.ExecuteNonQuery();
conn2.Close();
}
}
}
这段代码远非完美,但可能正是你的意思

如果您确实想做多个插入,那么不妨考虑一下“COD”。