You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改数据库查询代码将单值查询结果存入字符串变量(替代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();
    }
}

额外注意点

  1. SQL注入风险:永远不要直接拼接用户输入到SQL语句中,参数化查询是数据库操作的基本安全规范。
  2. 异常处理:原LoadSql的catch块直接返回null,不利于问题排查,建议捕获具体异常并记录日志或给用户明确提示。
  3. 空值处理:查询结果可能为null,使用?.ToString() ?? string.Empty可以避免空引用异常。

内容的提问来源于stack exchange,提问作者user18864224

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 19:02:31