今天在使用参数化查询循环插入数据库时,碰到这个问题: 变量名"@telNum"已声明。变量名在批查询或存储过程内部必须唯一。
在多次执行SqlCommand的时候,第一次执行没有错..第二次就会出现变量名在批查询或存储过程内部必须唯一,
这是因为以前的参数还存在事务中。所以在执行第二次时,变量无法辨别,我们只需SqlCommand执行完毕后,添加如下语句即可:cmd.Parameters.Clear();就可以了,也就是在同一事务中若要多次执行带有相同参数名的SQL语句,必须在第一次执行后清理参数.
以下是我写的C#源代码:
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "文本文件|*.txt";
if (ofd.ShowDialog() != true)
{
return;
}
else
{
string[] tels = File.ReadAllLines(ofd.FileName,Encoding.Default);
string connStr = @"Data Source=.\SQLExpress;Initial Catalog=practice;User ID=sa;Password=381213";
DateTime startTime = DateTime.Now; //获得开始执行sqlCommand的时间
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
for (int i = 1; i < tels.Length; i++)
{
string[] s = tels[i].Split('\t');
string startTelNum = s[0];
string area = s[1].Trim('"');
string telType = s[2].Trim('"');
string areaNum = s[3].Trim('"');
cmd.CommandText = "insert into telNum(telNum,area,telType,areaNum)values(@telNum,@area,@telType,@areaNum)";
cmd.Parameters.AddWithValue("@telNum", startTelNum);
cmd.Parameters.AddWithValue("@area", area);
cmd.Parameters.AddWithValue("@telType", telType);
cmd.Parameters.AddWithValue("@areaNum", areaNum);
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();//必须加上这句,不然在第二次执行sqlCommand时会报错
}
TimeSpan timespan = DateTime.Now - startTime;
double totaltimes=timespan.TotalSeconds; //计算耗费的总时间
MessageBox.Show("数据插入成功,共耗时" + totaltimes + "秒");
}
}
}
}