SQL查询在c#中不能正常工作,而大量数据被逐一应用

本文关键字:数据 应用 工作 查询 不能 常工作 SQL | 更新日期: 2023-09-27 18:11:41

我在c#中读取SQL Server时遇到了一个问题。它发生在SSIS中,我在数据流中插入了一个c#脚本。

我使用下面的代码:

using (SqlConnection connection = new SqlConnection(connectionString))
{
    string vendorName = Row.VendorName.ToString().Substring(0,1).ToUpper() + Row.VendorName.ToString().Substring(1);
    using (SqlCommand command = new SqlCommand("Select TOP 1 * from Logs where MessageId = '" + Row.id.ToString() + "'" +
                                "AND name = (Select Id from Names where vendor_name = '" + vendorName +
                                "order by CreatedDate desc", connection))
    {
        connection.Open();
        string status = "";
        using (SqlDataReader oReader = command.ExecuteReader())
        {
            while (oReader.Read())
            {
                status = oReader["Status"].ToString();
            }
        }
        if (String.IsNullOrEmpty(status))
        {
            SaveDataToDB(Row.id, Row.VendorName, "Unknown");
        }
    }
}

在Logs表中,大约有10000行,Row数据所属的相关数据源大约有9000条记录。问题是,尽管查询工作良好,但在脚本中,它有时会将状态值设置为null,因为它无法在SQL中找到记录。我得到的查询和复制/粘贴到SQL,执行查询带来的结果在那里,但不是在c#某种程度上。例如,我按顺序运行c#两次,第一次它说id: 354456的状态为空,但当我第二次运行它时,它正确地发现354456,但说354499的状态为空。

有什么办法可以解决这个问题吗?非常感谢你的帮助。

SQL查询在c#中不能正常工作,而大量数据被逐一应用

据我所述,这可能是由于查询中嵌入的用户定义值的求值顺序。可以是第一个动态值在内部查询中的值之前计算。

由于我不确定变量绑定的值,但是,我建议您检查以下几点:

a)将变量(供应商名称和行id)外部化,并评估并确保它们具有各自的值

b),然后用求值组成查询语句

可以在调用Execute之前调试并查看命令对象的CommandText。

你的代码真的是效率低下,你应该缓存vendorname在一个字符串和做所有的子字符串的操作。

例如:

 string vendorName = Convert.ToString(Row.VendorName);
 vendorName = vendorName.Substring(0,1).ToUpper() + vendorName.Substring(1);

不是选择所有列,而是选择特定的列来加速select Status from

试着先调试你的代码,看看你得到的是哪个id,以及你的查询结果是什么。

没有任何调试信息就很难调试你的代码。

将您的代码更改为此(Select Id from Names where vendor_name = '" + vendorName + "')",并在每个"字符"旁边放置空格,例如" AND而不是"AND