C#数据库操作特殊字符单引号三种处理方式

本文介绍三种处理SQL语句中特殊字符的方法:转义字符、SqlDataAdapter及参数化SQL语句。通过具体代码示例展示了如何避免SQL注入风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一:转义字符

使用单引号作为转义字符,即连续使用两个单引号。

select * from jq_jjjl where bt like '%女子''%'

上述代码会匹配jq_jjjl表中所有bt字段包含女子'的记录。(注意单引号)

方法二:SqlDataAdapter

string constr = "Server=" + DBConfig.DBAPP_IP + ";user id=" + DBConfig.DBAPP_USER + ";password=" + DBConfig.DBAPP_PASSWD + ";Database=" + DBConfig.DBAPP_DBNAME + ";Connect Timeout=30";
string cmdstr = "SELECT * FROM WIRELESS_POLICE_T";

// Create the adapter with the selectCommand txt and the connection string
SqlDataAdapter adapter = new SqlDataAdapter(cmdstr, constr);

// Create the builder for the adapter to automatically generate the Command when needed
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

// Create and fill the DataSet using the WIRELESS_POLICE_T
DataSet dataset = new DataSet();
adapter.Fill(dataset, "WIRELESS_POLICE_T");

// Get the WIRELESS_POLICE_T table from the dataset
DataTable table = dataset.Tables["WIRELESS_POLICE_T"];

// Indicate DataColumn WLPid is unique, This is required by the SqlCommandBuilder to update the WIRELESS_POLICE_T table
table.Columns["WLPid"].Unique = true;

// New row from the WIRELESS_POLICE_T table
DataRow row = table.NewRow();

// Update a column
//row["xxx"] = xxx;
// 你的赋值语句
// Now update the WIRELESS_POLICE_T using the adapter
// The OracleCommandBuilder will create the UpdateCommand for the adapter to update the WIRELESS_POLICE_T table
adapter.Update(dataset, "WIRELESS_POLICE_T");

方法三:构造SQL语句(类似java中的PreparedStatement)

            string constr = "Server=" + DBConfig.DBAPP_IP + ";user id=" + DBConfig.DBAPP_USER + ";password=" + DBConfig.DBAPP_PASSWD + ";Database=" + DBConfig.DBAPP_DBNAME + ";Connect Timeout=30";
            SqlConnection conn = new SqlConnection(constr);

            // 此处可能存在sql语句中含有单引号的问题
            /**
            string cmdstr = "update WIRELESS_PERSON_T set PersonName='"+person.getPersonName()
                +"', PersonSex='"+person.getPersonSex()+"', YID='"+person.getYID()
                +"', caseinfoid='"+person.getCaseinfoid()+"', Kind='"+person.getKind()
                +"', caseremark='"+person.getCaseremark()+"', ArrivalKind='"+person.getArrivalKind()
                +"' where personId="+person.getPersonId();
             * */

            string cmdstr = "update WIRELESS_PERSON_T set PersonName=@PersonName, PersonSex='" + person.getPersonSex() 
                + "', YID=@YID, caseinfoid='" + person.getCaseinfoid() + "', Kind='" + person.getKind()
                + "', caseremark=@Caseremark, ArrivalKind='" + person.getArrivalKind() + "' where PersonId=" + person.getPersonId();
            Console.WriteLine(cmdstr);
            //SqlCommand command = new SqlCommand(cmdstr, conn);
            SqlCommand command = conn.CreateCommand();
            command.CommandText = cmdstr;
            command.Parameters.Add(new SqlParameter("PersonName", person.getPersonName()));
            command.Parameters.Add(new SqlParameter("YID", person.getYID()));
            command.Parameters.Add(new SqlParameter("Caseremark", person.getCaseremark()));

            try
            {
                conn.Open();
                command.ExecuteNonQuery();
                Console.WriteLine("保存信息成功!");
            }
            catch (Exception e2)
            {
                MessageBox.Show("保存出错!" + e2.Message);
                return;

            }
            finally
            {
                conn.Close();
            }
上述代码中person为一个对象实例。


C#中,当你使用SQL查询字符串并且查询文本包含单引号(')时,可能会遇到一些问题,因为SQL语句通常会将单引号作为定界符用于字符串值,比如在`LIKE`操作符中搜索模式。例如: ```csharp string query = "SELECT * FROM Users WHERE Name = 'John'"; ``` 在这种情况下,如果你的数据表中的Name字段确实包含了单引号,直接拼接到查询字符串里就会出错,因为数据库会把整个单引号后面的文本当作一个字符串的一部分,导致语法解析错误。 为了避免这类错误,你可以采取以下几种策略: 1. **参数化查询** (Parameterized Query): 使用`SqlCommand.Parameters`来插入占位符(通常是问号?),然后在运行时提供实际值。这可以防止SQL注入攻击,并确保特殊字符被正确处理。 ```csharp string nameToSearch = "John's"; using (var connection = new SqlConnection(connectionString)) { var command = new SqlCommand("SELECT * FROM Users WHERE Name = @name", connection); command.Parameters.AddWithValue("@name", nameToSearch); // ... 执行查询 } ``` 2. **转义单引号**: 如果你知道数据源中不会有恶意输入,可以在字符串连接前手动转义单引号。 ```csharp string escapedQuery = $"SELECT * FROM Users WHERE Name = '{nameToSearch.Replace("'", "''")}')"; ``` 3. **使用SQL Server的动态SQL功能**: 这允许你在运行时构建查询,但同样需要小心避免SQL注入风险。 ```csharp string name = "John's"; string query = $"SELECT * FROM Users WHERE Name LIKE '%' + @name + '%'"; // ... 使用SqlCommand执行动态构建的query ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值