C# 过程或函数AppendDataCT指定的参数太多
我正在开发一个C#VS 2008/SQL Server网站应用程序。我是ASP.NET的新手。我得到上面的编译器错误。你能给我一些关于如何解决这个问题的建议吗 代码段: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_
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”。