標準System.Data
クラスDbConnection
とDbCommand
を使用してC#からSQL Serverに接続し、VARCHAR
またはNVARCHAR
パラメータを入力として使用するストアドプロシージャが多数あります。パラメータの最大長よりも長い文字列がそのパラメータに値として渡されると、SQL ServerとC#アプリケーションのどちらもエラーまたは警告をスローしませんでした。代わりに、値は静かにパラメータの最大長に切り捨てられます。ストアドプロシージャの入力はタイプVARCHAR(10)
であり、我々は'U R PRETTY STUPID'
に渡す場合ストアドプロシージャの入力をサイレントで切り捨てないようにするにはどうすればよいですか?
だから、たとえば、ストアドプロシージャは、私たちが言うことを意味したものは非常にいいが、完全ではありません'U R PRETTY'
などの入力を受け付けます。
これらの切り捨てを検出するために私が過去に行ったことと、others have likewise suggestedは、パラメータ入力の長さを必要以上に1文字大きくし、入力の長さが新しい最大長と等しいかどうかを確認することです。したがって、上記の例では私の入力はVARCHAR(11)
になり、長さ11の入力をチェックします。長さ11以上の入力はこのチェックで捕捉されます。これは機能しますが、間違っていると感じます。理想的には、データアクセス層はこれらの問題を自動的に検出します。
提供されたストアドプロシージャの入力が許可された時間を超えていることを検出する方法がありますか? DbCommand
はすでに入力の長さの制限を認識していないはずですか?
また、好奇心の問題として、入力を黙って切り捨てる原因は何ですか?
文字制限を取り除き、代わりにCHECK制約を使用できますか? –
@MikeChristensen - あなたは何を意味するのか少し拡大できますか?私たちのテーブルは、適切なデータ型(および長さ)、FK、および 'CHECK'制約で既に適切に制約されています。私が懸念しているのは、ストアド・プロシージャのロジックまたはクエリでそれらを使用する前に、制限を超える入力を検出することです。 –
ああ、お詫び申し上げます。私はあなたがテーブルに直接挿入していると思っていました。あなたはsprocのパラメータについて話しています。あなたはそれを 'VARCHAR(MAX)'にしてから、sprocの長さを調べることができますか? –