2012-01-20 9 views
0

何らかの理由で、クエリを実行しようとすると「無効な列名allocationStart」というエラーが表示されます。これはdateaddファンクション内にあり、カラムDOESはデータベースに存在します。 datetimeです。無効な列名 'allocationStart'

ここ

はクエリです:

cmd.commandText = "Insert Into EmpPac 
        (catalogIdent, empPacIdent, empIdent, allocation, 
         quantityLimit, quantityIssued, quantityShipped, 
         allocationMonths, sizeChartIdent, sizeNotes, nextUpdate) 
        values ('" & catalogIdent & "', '" & intvalue_EmpPak 
         & "', '" & empIdent & "',"&jobQuantityLimit&",'" 
         &jobQuantityLimit&"', '0', '0',"& 
         allocationMonths&", '"& sizeChartident & 
         "', '', DATEADD(month, "&allocationMonths& 
         ", allocationStart))" 
cmd.execute 
+2

まず、管理者用のスタジオでクエリが機能していますか?多くの理由から、SqlParameterではなく、文字列のcacatenationを使用してください。特に、パラメータタイプを扱う必要はなく、SQLインジェクション攻撃を避けます。 –

+0

これはASP.NETであり、古典的なASPではないと確信していますか? – Oded

+2

そしてあなたは本当に[SQLインジェクション](http://en.wikipedia.org/wiki/SQL_injection)を検索する必要があります – Oded

答えて

2

あなたには何であるかテーブルallocationstart指定しない

をあなたのINSERTソースは、ソース表からSELECTも使用しないようにする必要があります。 VALUESキーワードは明示的な値のリストを期待しているからです。例えば

INSERT INTO MyTargetTable 
SELECT <stuff>, DATEADD(month, XXX, allocationstart) 
FROM MySourceDataTable 
0

私は正直なところだろう - 私はあなたの質問を100%以下ではないよしかし、私は私はあなたが何をしようとして理解すると思います。

元のエラーはDATEADDコマンドで発生しています。

DATEADDの3番目のパラメータは、操作するdatetime値です。

私はあなたの "allocationStart"列がDB内で自動的に現在の日付時刻を設定し、その列をDATEADD関数に渡して操作し、返された値を "nextUpdate"列に挿入すると推測しています。これが何をしようとしているのであれば、行がコミットされるまでauto datetimeカラムは設定されません(日付/時刻などを返すことができる)ので、INSERT文の中で関数内でauto = generatedカラムを使用することはできません。

私は強く、より安全でより良いプラクティスをパラマテラスで見ることをお勧めします。

「nextUpdate」列の月の番号の後にある場合は、DateTime.Now.Monthを使用してSQL文字列に追加することができます。