如何修改数据库查询代码将单值查询结果存入字符串变量(替代DataTable存储)
如何将Oracle查询结果存入字符串变量?
我看了你的代码,现在LoadSql返回的是DataTable,但你想把查询到的KUNDENAUFTRAGSNR值存入字符串变量WNR里。首先得提个重要的点:你当前的SQL拼接方式存在严重的SQL注入风险,直接把用户输入(txt_Barcode_read.Text)拼进SQL语句是非常危险的,必须改成参数化查询,我后面的代码会一起修正这个问题。
针对你的需求,有两种常见的实现方式,你可以根据情况选择:
方式一:在LoadData中处理DataTable提取字符串
保持LoadSql不变,在获取到DataTable后,检查是否有数据,然后提取第一行第一列的值(因为你的查询是返回单列,且应该是单行结果):
public void LoadData(string KNR, string WNR, string filter) { // 改用参数化SQL,避免SQL注入 const string sqlTemplate = "SELECT KUNDENAUFTRAGSNR FROM MESSFELD.AUSSTANDSDATEN WHERE FTNR = :FTNR"; Database cdb = new Database(); // 尝试连接数据库 if (!cdb.Open("**********", "*********")) { SetStatusText("Datenbank ist nicht verfügbar."); return; } try { // 原代码的string.Format未用到filter,若后续需要使用filter也需改为参数化形式 DataTable dt = cdb.LoadSql(sqlTemplate); // 检查DataTable是否包含有效数据 if (dt != null && dt.Rows.Count > 0) { // 提取第一行第一列的值并转为字符串,处理可能的空值 WNR = dt.Rows[0][0]?.ToString() ?? string.Empty; } else { // 未查询到数据时的处理 WNR = string.Empty; SetStatusText("Keine passenden Daten gefunden."); } } catch (Exception ex) { SetStatusText($"Fehler beim Laden der Daten: {ex.Message}"); WNR = string.Empty; } finally { // 确保数据库连接被关闭 cdb.Close(); } }
方式二:新增一个返回字符串的查询方法(更推荐)
既然你只需要单个字符串值,没必要返回整个DataTable,可以在Database类里新增一个专门返回单行单列结果的方法,比如LoadSqlScalar:
// 在Database类中新增方法 public string LoadSqlScalar(string sql, params OracleParameter[] parameters) { try { using (OracleCommand command = new OracleCommand(sql, _con)) { command.InitialLONGFetchSize = -1; // 添加参数(如果有) if (parameters != null && parameters.Length > 0) { command.Parameters.AddRange(parameters); } // 执行查询,获取单行单列结果 object result = command.ExecuteScalar(); // 处理结果:非null则转字符串,否则返回空字符串 return result?.ToString() ?? string.Empty; } } catch (Exception ex) { // 可添加日志记录,方便排查问题 Console.WriteLine($"Fehler bei der SQL-Abfrage: {ex.Message}"); return string.Empty; } }
然后修改LoadData方法,使用这个新方法并完善参数化:
public void LoadData(string KNR, string WNR, string filter) { const string sql = "SELECT KUNDENAUFTRAGSNR FROM MESSFELD.AUSSTANDSDATEN WHERE FTNR = :FTNR"; Database cdb = new Database(); if (!cdb.Open("**********", "*********")) { SetStatusText("Datenbank ist nicht verfügbar."); return; } try { // 创建参数,彻底避免SQL注入 OracleParameter param = new OracleParameter(":FTNR", OracleDbType.Varchar2) { Value = txt_Barcode_read.Text }; // 调用新方法获取字符串结果 WNR = cdb.LoadSqlScalar(sql, param); if (string.IsNullOrEmpty(WNR)) { SetStatusText("Keine passenden Daten gefunden."); } } catch (Exception ex) { SetStatusText($"Fehler beim Laden der Daten: {ex.Message}"); WNR = string.Empty; } finally { cdb.Close(); } }
额外注意点
- SQL注入风险:永远不要直接拼接用户输入到SQL语句中,参数化查询是数据库操作的基本安全规范。
- 异常处理:原
LoadSql的catch块直接返回null,不利于问题排查,建议捕获具体异常并记录日志或给用户明确提示。 - 空值处理:查询结果可能为null,使用
?.ToString() ?? string.Empty可以避免空引用异常。
内容的提问来源于stack exchange,提问作者user18864224
相关产品推荐
相关产品推荐

