Parameters.AddWithValue方法在SQL语句的 Where 字句中的用法

本文探讨了在使用Parameters.AddWithValue方法时遇到的问题及解决办法。详细解释了为何在某些情况下该方法会导致SQL语法错误,并提供了一个正确的代码示例。

今天晚上看论坛,有人提问说,Parameters.AddWithValue方法在有些情况下不好使,他的写法是这样的:

string strWhere = "'%美%'"; strSql = "SELECT * FROM area Where [name] like @strWhere";//这个就不好使 cmd.Parameters.AddWithValue("@strWhere", strWhere);

这是因为,ASP.NET在生成SQL语句时,会在Like后面再加上一次单引号,造成错误,如果打开 SQL Server的跟踪管理器,可以看到执行的语句如下

exec sp_executesql N'SELECT * FROM Article Where [Title] like @strWhere',N'@strWhere nvarchar(5)',@strWhere=N'%为什么%'

不难理解,在 OldDbCommand 中也会有类似的做法。

正确的代码为:

string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\aspxWeb.mdb;"; OleDbConnection con = new OleDbConnection(connectionString); con.Open(); OleDbCommand cmd = new OleDbCommand(); cmd.Connection = con; string strWhere = "%孟宪会%"; string strSql = "SELECT * FROM Document Where [Author] like @strWhere"; cmd.Parameters.AddWithValue("@strWhere", strWhere); cmd.CommandText = strSql; OleDbDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { Response.Write(dr["Author"] + " : " + dr["Title"] + "<br>"); } con.Close(); con.Dispose();

帮我把这个 // 插入数据到 applyinfo 表 string sqlInsert1 = $@" INSERT INTO myapply ( FlowId, TableId, Node, Nid, Nname, Theme, ReaderName, ReaderId, StateId, State, ReadTime, ApplyTime, factory ) VALUES ( @FlowId, @TableId, @Node, @Nid, @Nname, @Theme, @ReaderName, @ReaderId, @StateId, @State, @ReadTime, @ApplyTime, @factory )"; using (MySqlConnection conn = new MySqlConnection(AppSetting.PrmReadOnlyConnectionStringtest)) // 确保是可写连接 using (MySqlCommand cmdInsert = new MySqlCommand(sqlInsert1, conn)) { // 添加参数 cmdInsert.Parameters.AddWithValue("@FlowId", 7002); cmdInsert.Parameters.AddWithValue("@TableId", TableId); cmdInsert.Parameters.AddWithValue("@Node", "评委"); cmdInsert.Parameters.AddWithValue("@Nid", projectInfoForm.ApplicantId); cmdInsert.Parameters.AddWithValue("@Nname", projectInfoForm.ApplicantName); cmdInsert.Parameters.AddWithValue("@Theme", $"{projectInfoForm.ApplicantName}发起的TS-II系统评审流程"); cmdInsert.Parameters.AddWithValue("@ReaderName", name); cmdInsert.Parameters.AddWithValue("@ReaderId", id); cmdInsert.Parameters.AddWithValue("@StateId", PRMInitiateDate); cmdInsert.Parameters.AddWithValue("@State", 0); cmdInsert.Parameters.AddWithValue("@ReadTime", PRMInitiateDate); cmdInsert.Parameters.AddWithValue("@ApplyTime", PRMInitiateDate); cmdInsert.Parameters.AddWithValue("@factory",projectInfoForm.File_Factory); conn.Open(); int rowsAffected = cmdInsert.ExecuteNonQuery(); // 执行插入 if (rowsAffected > 0) { Console.WriteLine("PRMapplyinfo表插入成功"); } else { Console.WriteLine("PRMapplyinfo表插入失败"); } }像这样封装成方法 public DataTable GetPWD(string creatorid) { string sql = $@"SELECT id, userId, password, userName, corporation, factory, department, section, userArea, userEamil AS userEmail, userPhone, userPosition, rank, userRole, state, CreateTime, costcenter FROM user_table1 WHERE userId = @creatorid"; using (MySqlConnection conn = new MySqlConnection(AppSetting.PrmReadOnlyConnectionString)) using (MySqlCommand cmd = new MySqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@creatorid", creatorid); conn.Open(); using (MySqlConnector.MySqlDataAdapter adapter = new MySqlConnector.MySqlDataAdapter(cmd)) { DataTable dt = new DataTable(); adapter.Fill(dt); return dt; } } }
最新发布
09-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值