【发布时间】:2019-02-08 07:29:47
【问题描述】:
我有一个代码块正在重复执行,但只更改了表名。
SQLData stagingData = runtime.SQLExecuteQuery(integrationDatabase, "SELECT COUNT (*) AS ROW_COUNT FROM *<DATABASE NAME>*");
foreach(SQLDataRow stagingDataRow in stagingData)
{
stageCount = runtime.SQLDataRowGetInteger(stagingDataRow, "ROW_COUNT");
}
if(stageCount !=0)
{
writeStaging = runtime.SQLExecuteStoredProcedure(integrationDatabase, "*<STORED PROCEDURE NAME>*", 0);
SQLData transformedData = runtime.SQLExecuteQuery(integrationDatabase,
"SELECT COUNT (*) AS ERROR_COUNT FROM *<TABLE NAME>* WHERE " +
"[Entity] LIKE '_ERROR_%' OR [Name] LIKKE '_ERROR_'%");
foreach (SQLDataRow transDataRow in transformedData)
{
errorCount = runtime.SQLDataRowGetInteger(transDataRow, "ERROR_COUNT");
}
if (errorCount == 0)
{
writeTransformed = runtime.SQLExecuteStoredProcedure(integrationDatabase, "*<STORED PROCEDURE NAME>*", 0);
}
else
{
return false;
}
}
这是重复执行的代码块。 斜体的项目是唯一变化的。
我们想减少这部分的行数,但我们找不到一个好的结构来做到这一点。
我们希望听到您的建议。
P.S.我们在一个类中执行这个。
谢谢。
【问题讨论】:
-
您不能在 SQL 中参数化对象名称。所以......你会得到的最好的是某种模板化部分,从某个地方获取表名/存储过程名称(可能是配置、
[SomeTableName("Foo")]等属性、方法参数、抽象基类型上的虚拟属性, 等等)。抱歉,这里没有真正的整洁/神奇的解决方案。 -
这听起来你应该用错误类型创建 1 个表,而不是每个表 1 个......
-
SQLServer 有一些执行字符串查询的命令。不知道MySql有没有这样的东西。如果有,您可以在数据库中创建存储过程。之后你的 C# 代码会更好看!
-
@AliDoustkani 只是移动了丑陋。你说的是
sp_executesql之类的东西,但是: still 不能参数化模式/对象/列名 - 所以你最终要做的就是从 C# 移动字符串 concat/replace到 SQL。我不认为这是一个优势,在很多方面它是一个劣势。 SQL 可以进行字符串操作,但 C# 在这些方面要好得多(在方便性和可读性方面)。 -
感谢您的 cmets/建议,我会记住这些。
标签: c# mysql performance foreach