SqlCommand.Parameters的使用

本文介绍了在C#中如何使用SqlParameterCollection进行SQL参数化查询,以提高安全性并防止SQL注入攻击。通过示例展示了更新操作的具体实现,并分享了分页查询及Like条件使用的技巧。

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

   在c#中执行sql语句时,避免会遇到传参的问题。Parameters就是用来做参数化查询,不然很容易被黑客拿到数据。

 一、简介

  引用自:https://msdn.microsoft.com/ZH-CN/library/system.data.sqlclient.sqlcommand.parameters(v=vs.110).aspx

  命名空间:   System.Data.SqlClient
  程序集:  System.Data(位于 System.Data.dll)

  语法

  public SqlParameterCollection Parameters { get; }

  属性值

  Type: System.Data.SqlClient.SqlParameterCollection

  Transact-SQL 语句或存储过程的参数。 默认值为空集合。

 二、示例

private static void UpdateDemographics(Int32 customerID,
    string demoXml, string connectionString)
{
    // Update the demographics for a store, which is stored 
    // in an xml column. 
    string commandText = "UPDATE Sales.Store SET Demographics = @demographics "
        + "WHERE CustomerID = @ID;";

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand command = new SqlCommand(commandText, connection);
        command.Parameters.Add("@ID", SqlDbType.Int);
        command.Parameters["@ID"].Value = customerID;

        // Use AddWithValue to assign Demographics.
        // SQL Server will implicitly convert strings into XML.
        command.Parameters.AddWithValue("@demographics", demoXml);

        try
        {
            connection.Open();
            Int32 rowsAffected = command.ExecuteNonQuery();
            Console.WriteLine("RowsAffected: {0}", rowsAffected);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

 

   三、常见用法

  1. 分页查询

   如下定义, 如果在查询数据语句和查询总条数中使用,会在第二处提示被引用的异常

List<SqlParameter> parameters = new List<SqlParameter>()  ;

  解决方法:

 parameters.Select(x => ((ICloneable)x).Clone()).ToArray<object>()

  2. Like的用法

  原因是传入的参数会被自动加上单引号,直接使用 Title like '%@Title%'会出错

if (!string.IsNullOrEmpty(Title))
{ 
    keyCondition += " and (Title like @Title ) ";
    parameters.Add(new SqlParameter() { ParameterName = "@Title", Value = "%" + Title + "%" });
}

 

  

 

#region 新增异常信息 /// <summary> /// 新增异常信息 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ToolStripButtonInsertInfo_Click(object sender, EventArgs e) { TrafficCenter.Instance.skin.SkinAllForm = false; string site = "";//站点信息 string equipment = "";//设备信息 string component = "";//元器件信息 string operatorInfo = "";//操作人信息 string isReplace = "";//是否进行了更换 string errorInfo = "";//故障信息 string reason = "";//故障原因 string solution = "";//对策 var sheet1 = SelectDeviceInfosheetStep1(); //如果选择了站点信息 if (sheet1 != null) { site = sheet1["站点信息"].Data.ToString(); var sheet2 = SelectDeviceInfosheetStep2(site); //如果选择了设备信息 if (sheet2 != null) { equipment = sheet2["设备名称"].Data.ToString(); var sheet3 = SelectDeviceInfosheetStep3(site, equipment); //如果选择了元器件信息 if (sheet3 != null) { component = sheet3["元器件信息"].Data.ToString(); var sheet4 = InsertErroeInfo(site, equipment, component); //如果点击完成了异常信息的录入 if (sheet4 != null) { operatorInfo = sheet4["操作人(请输入工号)"].Data.ToString(); isReplace = sheet4["是否进行了更换"].Data.ToString(); errorInfo = sheet4["故障信息"].Data.ToString(); reason = sheet4["故障原因"].Data.ToString(); solution = sheet4["对策"].Data.ToString(); using (SqlConnection conn = new SqlConnection(ConnectionString)) { conn.Open(); Console.WriteLine("连接成功!"); Thread.Sleep(500); using (SqlCommand sqlCommand = new SqlCommand("INSERT INTO EquipmentAbnormalCondition(Sites,Equipment,Components,Operator,IsReplacement,FaultInformation,Reasons,Countermeasures) VALUES(@Sites,@Equipment,@Components,@Operator,@IsReplace,@ErrorInfo,@Reason,@Solution)", conn)) { //添加参数 sqlCommand.Parameters.AddWithValue("@Sites", site); sqlCommand.Parameters.AddWithValue("@Equipment", equipment); sqlCommand.Parameters.AddWithValue("@Components", component); sqlCommand.Parameters.AddWithValue("@Operator", operatorInfo); sqlCommand.Parameters.AddWithValue("@IsReplace", isReplace); sqlCommand.Parameters.AddWithValue("@ErrorInfo", errorInfo); sqlCommand.Parameters.AddWithValue("@Reason", reason); sqlCommand.Parameters.AddWithValue("@Solution", solution); sqlCommand.ExecuteNonQuery(); } conn.Close(); Invoke(new Action(() => { MessageBox.Show("异常信息上传成功!"); })); } } } } } TrafficCenter.Instance.skin.SkinAllForm = true; } /// <summary> /// 异常数据上传时选择站点信息 /// </summary> /// <returns></returns> private DataEntrySheet SelectDeviceInfosheetStep1() { DataEntrySheet sheet = new DataEntrySheet(); using (SqlConnection connection = new SqlConnection(ConnectionString)) { connection.Open(); using (SqlCommand sqlCommand = new SqlCommand("SELECT DISTINCT Sites FROM DeviceInformation", connection)) { using (SqlDataReader reader = sqlCommand.ExecuteReader()) { List<string> stations = new List<string>(); while (reader.Read()) { stations.Add(reader["Sites"].ToString()); } sheet.AddComboBoxField(new ComboBoxField() { Title = "站点信息", Items = stations.ToArray()// 设置ComboBox的Items属性 }); } } connection.Close(); } var dialog = provider.CreateDataEntrySheetDialog(sheet, s => { s.Title = "故障信息维护"; // 是否可取消 s.Cancelable = true; // 确认按钮文本 s.ConfirmOption.Text = "下一步"; // 取消按钮文本 s.CancelOption.Text = "取消"; }); dialog.Show(); if (dialog.Result.IsCancel) { return null; } return sheet; } /// <summary> /// 异常数据上传时选择设备信息 /// </summary> /// <param name="site"></param> /// <returns></returns> private DataEntrySheet SelectDeviceInfosheetStep2(string site) { DataEntrySheet sheet = new DataEntrySheet(); using (SqlConnection connection = new SqlConnection(ConnectionString)) { connection.Open(); using (SqlCommand sqlCommand = new SqlCommand("SELECT DISTINCT Equipment FROM DeviceInformation WHERE Sites = @Site", connection)) { sqlCommand.Parameters.AddWithValue("@Site", site); using (SqlDataReader reader = sqlCommand.ExecuteReader()) { List<string> stations = new List<string>(); while (reader.Read()) { stations.Add(reader["Equipment"].ToString()); } //显示站点信息的文本框 sheet.AddTextField(new TextField() { Title = "站点名称", Data = site }); sheet.AddComboBoxField(new ComboBoxField() { Title = "设备名称", Items = stations.ToArray()// 设置ComboBox的Items属性 }); } } connection.Close(); } var dialog = provider.CreateDataEntrySheetDialog(sheet, s => { s.Title = "故障信息维护"; // 是否可取消 s.Cancelable = true; // 确认按钮文本 s.ConfirmOption.Text = "下一步"; // 取消按钮文本 s.CancelOption.Text = "取消"; }); dialog.Show(); if (dialog.Result.IsCancel) { return null; } return sheet; } /// <summary> /// 异常数据上传时选择元器件信息 /// </summary> /// <param name="site"></param> /// <param name="equipment"></param> /// <returns></returns> private DataEntrySheet SelectDeviceInfosheetStep3(string site, string equipment) { DataEntrySheet sheet = new DataEntrySheet(); using (SqlConnection connection = new SqlConnection(ConnectionString)) { connection.Open(); using (SqlCommand sqlCommand = new SqlCommand("SELECT DISTINCT Components FROM DeviceInformation WHERE Sites = @Site AND Equipment = @Equipment", connection)) { sqlCommand.Parameters.AddWithValue("@Site", site); sqlCommand.Parameters.AddWithValue("@Equipment", equipment); using (SqlDataReader reader = sqlCommand.ExecuteReader()) { List<string> stations = new List<string>(); while (reader.Read()) { stations.Add(reader["Components"].ToString()); } //显示站点信息的文本框 sheet.AddTextField(new TextField() { Title = "站点名称", Data = site }); //显示设备信息的文本框 sheet.AddTextField(new TextField() { Title = "设备名称", Data = equipment }); sheet.AddComboBoxField(new ComboBoxField() { Title = "元器件信息", Items = stations.ToArray()// 设置ComboBox的Items属性 }); } } connection.Close(); } var dialog = provider.CreateDataEntrySheetDialog(sheet, s => { s.Title = "故障信息维护"; // 是否可取消 s.Cancelable = true; // 确认按钮文本 s.ConfirmOption.Text = "下一步"; // 取消按钮文本 s.CancelOption.Text = "取消"; }); dialog.Show(); if (dialog.Result.IsCancel) { return null; } return sheet; } /// <summary> /// 输入异常信息 /// </summary> /// <param name="site"></param> /// <param name="equipment"></param> /// <param name="component"></param> /// <returns></returns> private DataEntrySheet InsertErroeInfo(string site, string equipment, string component) { DataEntrySheet sheet = new DataEntrySheet(); //显示站点信息的文本框 sheet.AddTextField(new TextField() { Title = "站点名称", Data = site }); //显示设备信息的文本框 sheet.AddTextField(new TextField() { Title = "设备名称", Data = equipment }); //显示元器件信息的文本框 sheet.AddTextField(new TextField() { Title = "元器件名称", Data = component }); sheet.AddTextField(new TextField() { Title = "操作人(请输入工号)" }); sheet.AddComboBoxField(new ComboBoxField() { Title = "是否进行了更换", Items = new string[] { "是", "否" } }); sheet.AddTextField(new TextField() { Title = "故障信息", IsMultiline = true }); sheet.AddTextField(new TextField() { Title = "故障原因", IsMultiline = true }); sheet.AddTextField(new TextField() { Title = "对策", IsMultiline = true }); var dialog = provider.CreateDataEntrySheetDialog(sheet, s => { s.Title = "故障信息维护"; // 是否可取消 s.Cancelable = true; // 确认按钮文本 s.ConfirmOption.Text = "上传"; // 取消按钮文本 s.CancelOption.Text = "取消"; //窗口大小 s.DialogSize = new Size(500, 600); }); dialog.Show(); if (dialog.Result.IsCancel) { return null; } return sheet; } #endregion 帮我将四个临时窗口合成一个,要求功能一致
最新发布
06-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值