2017-05-11 6 views
1

私は構成済みの要素リストを取得し、その値をデータベースに書き込む次のC#スクリプトを用意しました。C#Script - 特定のデータベースフィールドにのみ書き込むように変更する

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; 
    } 
} 

問題は、このスクリプトを添付する各設定で、フィールドは上記のいずれかの組み合わせである可能性があります。たとえば、1つの構成では、IdentifierフィールドとNameフィールドだけを使用し、別のフィールドでは5フィールドすべてを使用し、さらに別のフィールドでは3フィールドしか使用しないことがあります。したがって、スクリプトを実行する際にエラーが発生するのを避けるために、スクリプトから使用しないフィールドを手動で削除する必要があります。

このコードを変更して、使用されていないフィールドを手動で削除する必要はありません。それはIFELSE IFのステートメントのいくつかのフォームと思われるだろうが、私はどのようにフィールドの可能な組み合わせすべてのリストの外で行われるだろうと思いますか?

+7

私は特にコメントなどを'/ WINDOWS AUTHENTICATION'の後ろにDをつけてください:D(これはすべてコメントで行いました!) – Jamiec

+0

' IExportReader'に慣れていませんが、 'HasField'などのメソッドがあります。フィールドは、特定のデータセットに存在しますか? – Jamiec

+0

あなたがそれらをすべて使用しないときには、私はあなたが未使用のものを 'ヌル 'にしたいと思いますか?値を持たないパラメータに 'DBNull.Value'を代入するだけです。 – Crowcoder

答えて

1

と仮定すると、あなたのIExportReaderフィールドは、あなただけのこれに似た何かができる存在するかどうかを決定するためにいくつかの方法(メソッドHasFieldを想定して、すべてのフィールドがNULL可能である)があります。

sqlCommand.Parameters.AddWithValue("@SourceId", 
    dataReader.HasField("SourceId") 
      ? dataReader.GetStringValue("SourceId") 
      : DBNull.Value); 
+0

提案していただきありがとうございます。いくつかのフィールドはnull可能ではありませんが、これらのフィールドは常にスクリプト内に存在するため、これは問題ありません。私はこれが存在するかどうかわからないので、HasFieldの代替案をさらに調べる必要があります。 – Stpete111

関連する問題