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'の代わりに他の列を追加しようとしましたが、それはこのように爆発するものです。
あなたのコードはSQLインジェクションの影響を受けやすいです。パラメータを使用する必要があります。 – Cameron
データレイヤーに問題があると思われる場合は、データレイヤーを調査してください。 'FetchDataFromCustomerDatabase()'であるブラックボックスを開きます。 –
私はそのボックスを開くというアイデアに驚いていますが、それが唯一の方法であれば... SQLインジェクションの良い点でも、後でそれを残すべきではないかもしれません。 –