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的状态为空。
有什么办法可以解决这个问题吗?非常感谢你的帮助。据我所述,这可能是由于查询中嵌入的用户定义值的求值顺序。可以是第一个动态值在内部查询中的值之前计算。
由于我不确定变量绑定的值,但是,我建议您检查以下几点:
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