ADO.NET参数化查询时问题, 变量名"@telNum"已声明。变量名在批查询或存储过程内部必须唯一

今天在使用参数化查询循环插入数据库时,碰到这个问题: 变量名"@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 + "秒");
                    }
                }
            }

        }

这段代码看起来是一个基于 Python 的数据库操作程序,主要包括以下几个功能: 1. 打开数据库连接函数 `opendb()` 2. 关闭数据库连接函数 `closedb()` 3. 显示所有记录函数 `showalldb()` 4. 添加记录函数 `adddb()` 5. 删除记录函数 `deldb()` 6. 修改记录函数 `alterdb()` 7. 按学号查询记录函数 `searchdb()` 8. 是否继续子函数 `conti()` 其中,函数 `opendb()` 打开数据库连接,返回数据库连接对象和游标对象;函数 `closedb()` 关闭数据库连接;函数 `showalldb()` 查询并打印出所有记录;函数 `adddb()` 向数据库中添加一条新记录;函数 `deldb()` 删除指定学号的记录;函数 `alterdb()` 修改指定学号的记录;函数 `searchdb()` 按姓名查询记录并打印出查询结果;函数 `conti()` 用于判断是否继续执行程序。 需要注意的是,在修改记录和按姓名查询记录,SQL 语句中的变量未加引号,可能会导致语法错误。正确的写法应该是: ```python hel[1].execute("""update tongxinlu set username=?,password=?,address=?,telnum=? where usernum='{}'""".format(choice), (info[0],info[1],info[2],info[3],info[4])) cur.execute("select * from tongxinlu where username='{}'".format(searchchoice)) ``` 另外,在执行 SQL 语句,最好使用参数化查询,避免 SQL 注入攻击。如下所示: ```python hel[1].execute("update tongxinlu set username=?, password=?, address=?, telnum=? where usernum=?", (info[0], info[1], info[2], info[3], choice)) cur.execute("select * from tongxinlu where username=?", (searchchoice,)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值