2017-06-27 15 views
0

161行を返すSQL文があります。追加の列を追加すると、それはキーではなく、戻ってくる行の数は5000以上に増えます。その大部分は完全に空です。列を追加すると何千もの空の行が追加される

sqlステートメントは、ある顧客の構成リストを取得し、別の顧客からの一致する構成(同じ構成名を持つ「一致」という意味)を表示することになっています。私はそれが一致しているかどうかを確認する必要があり、一致のないものの設定データも持っている必要があります。

マイコード:

... 

    var myTable = new DataTable(); 
    try 
    { 
     string sql = "SELECT SourceConfig.ConfigurationId AS 'SourceID', " + 
          "SourceConfig.Name, " + 
    /* Added this line */ "SourceConfig.ConfigurationData AS 'SourceData', " + 
          "TargetConfig.ConfigurationId AS 'TargetID' " + 
        "FROM ConfigurationTable SourceConfig " + 
        "LEFT JOIN ConfigurationTable TargetConfig ON " + 
         "(TargetConfig.CustomerID = " + getTargetID() + " AND " + 
         "SourceConfig.Name = TargetConfig.Name)" + 
        "WHERE SourceConfig.CustomerId = " + getSourceID(); 
     myTable = this.accessService.FetchDataFromCustomerDatabase(sql); 
     myTable.PrimaryKey = new DataColumn[1] { myTable.Columns[0] }; // Error here 
    } 
    catch (Exception e) 
    { 
     // Record error message 
     return; 
    } 

    // Do stuff with 'myTable' 
... 

私の前のコードは、SQL文の3行目が「ConfigurationData」をもたらすことが、なぜその行の原因にこのエラーを追加するということはありませんでしたか?列 'ConfigurationData'はキー、プライマリまたはそれ以外のものではありません。私はnull値を除外する別のWHERE条件を追加しようとしましたが、私はまだ何千もの行を取得します。

「Microsoft SQL Management Studio」で同じSQL文を実行すると、このエラーは発生しません。そこにはまだ161行が返されます。 Visual StudioでC#コードを実行したときに、これらの空白の行で衝撃を受けます。

この問題は、SQL Management Studioが "(XML(。)、not null)"というラベルを付けた新しい列のデータ型に関係していると思います。私は 'ConfigurationData'の代わりに他の列を追加しようとしましたが、それはこのように爆発するものです。

+6

あなたのコードはSQLインジェクションの影響を受けやすいです。パラメータを使用する必要があります。 – Cameron

+1

データレイヤーに問題があると思われる場合は、データレイヤーを調査してください。 'FetchDataFromCustomerDatabase()'であるブラックボックスを開きます。 –

+0

私はそのボックスを開くというアイデアに驚いていますが、それが唯一の方法であれば... SQLインジェクションの良い点でも、後でそれを残すべきではないかもしれません。 –

答えて

0

SQLインジェクションから身を守りたいと思っているうちに、私は元の問題を修正しました。 Go figure。私はここから解決策を見つけました:Read SQL Table into C# DataTable

本質的に問題は 'FetchDataFromCustomerDatabase()'であり、私が安全なやり方をしているなら、その方法は使用しません。新しいコード:

... 

    var myTable = new DataTable(); 
    try 
    { 
     using (SqlConnection connection = new SqlConnection(ConnectionString)) 
     { 
      string sql = "SELECT SourceConfig.ConfigurationId AS 'SourceID', " + 
           "SourceConfig.Name, " + 
           "SourceConfig.ConfigurationData AS 'SourceData', " + 
           "TargetConfig.ConfigurationId AS 'TargetID' " + 
         "FROM ConfigurationTable SourceConfig " + 
         "LEFT JOIN ConfigurationTable TargetConfig ON " + 
          "(TargetConfig.CustomerID = @targetCustID AND " + 
          "SourceConfig.Name = TargetConfig.Name)" + 
         "WHERE SourceConfig.CustomerId = @sourceCustID"; 

      var command = new SqlCommand(sql, connection); 
      command.Parameters.Add("@sourceCustID", SqlDbType.Int); 
      command.Parameters.Add("@targetCustID", SqlDbType.Int); 
      command.Parameters["@sourceCustID"].Value = sourceCustID; 
      command.Parameters["@targetCustID"].Value = targetCustID; 

      var da = new SqlDataAdapter(command); 
      da.Fill(myTable); 
      da.Dispose(); 

      myTable.PrimaryKey = new DataColumn[1] { myTable.Columns[0] }; 
     } 
    } 
    catch (Exception e) 
    { 
     // Record error message 
     return; 
    } 

    // Do stuff with 'myTable' 
... 
関連する問題