我有以下C#脚本,它接受已配置的元素列表并将值写入数据库。
using System;
using System.IO;
using System.Data.SqlClient;
public class Script
{
public static bool ExportData(DataExportArguments args)
{
try
{
var sqlStringTest = new SqlConnectionStringBuilder();
// SERVER/INSTANCE
sqlStringTest.DataSource = "SQL Server";
// DATABASE NAME
sqlStringTest.InitialCatalog = "Database";
sqlStringTest.IntegratedSecurity = false;
sqlStringTest.UserID = "user";
sqlStringTest.Password = "password";
using (var sqlConnection = new SqlConnection(sqlStringTest.ConnectionString))
{
sqlConnection.Open();
using (IExportReader dataReader = args.Data.GetTable()) //Get the main data table
{
while (dataReader.Read()) // Loop through Export data rows
{
using (var sqlCommand = new SqlCommand())
{
sqlCommand.Connection = sqlConnection;
sqlCommand.CommandText = @"INSERT INTO [dbo].[Subjects] (
SourceId,
DirectSourceUrl,
Identifier,
Name,
Category)
VALUES (
@SourceId,
@DirectSourceUrl,
@Identifier,
@Name,
@Category)";
sqlCommand.Parameters.AddWithValue("@SourceId", dataReader.GetStringValue("SourceId"));
sqlCommand.Parameters.AddWithValue("@DirectSourceUrl", dataReader.GetStringValue("DirectSourceUrl"));
sqlCommand.Parameters.AddWithValue("@Identifier", dataReader.GetStringValue("Identifier"));
sqlCommand.Parameters.AddWithValue("@Name", dataReader.GetStringValue("Name"));
sqlCommand.Parameters.AddWithValue("@Category", dataReader.GetStringValue("Category"));
sqlCommand.ExecuteNonQuery();
}
}
}
}
}
catch (Exception exp)
{
args.WriteDebug(exp.ToString(), DebugMessageType.Error);
return false;
}
return true;
}
}
问题是,对于我附加此脚本的每个配置,字段可以是上述任意组合。例如,在一种配置中,我可能只使用Identifier
和Name
字段,而在另一个,全部5个字段中,而在另一个配置中,可能只有3个字段。因此,我必须为每个单独的配置手动删除脚本中未使用的字段,以避免在运行脚本时出错。
如何修改此代码,以便我不必手动删除未使用的字段?它似乎是某种形式的IF
和ELSE IF
陈述,但我无法想到如何在列出每个可能的字段组合之外完成它?
答案 0 :(得分:1)
假设您的IExportReader
有某种方法可以确定字段是否存在,您可以执行与此类似的操作(假设方法HasField
,并且所有字段都可以为空):
sqlCommand.Parameters.AddWithValue("@SourceId",
dataReader.HasField("SourceId")
? dataReader.GetStringValue("SourceId")
: DBNull.Value);