C# の DateTime 値を SQL Server 2005 ストアド プロシージャに渡すときに問題が発生しています。
ストアド プロシージャは型のパラメーターを取り、DateTime
渡された値でデータベース列を更新します (列もdatetime
型です)。
ALTER PROCEDURE [dbo].[ProcedureName]
@id int,
@eta datetime
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
BEGIN TRANSACTION
UPDATE
TrackingTable
set
ETA = @eta
where
ID = @id
COMMIT TRANSACTION
END
パラメータ化されていないクエリdatetime
を作成して実行することにより、ストアド プロシージャにC# の値を渡します。SqlParameter
アナライザーを介して、実行された SQL が次のようになっていることがわかります。
exec ProcedureName @id=19020, @eta='2012-07-17 10:29:34:000'
これをデータベースで直接実行すると、更新は正常に機能しますが、私の C# プログラムでは次のエラーで失敗します。
char データ型から datetime データ型への変換により、範囲外の datetime 値が発生しました。ステートメントは終了されました。
私はばかげていると確信していますが、何が悪いのか一生わかりません。PS SQL Server は初めてです。
どんな助けでも大歓迎です!ありがとう。
申し訳ありませんがC#コード:
dbWrapper.ExecuteProcWithParams("ProcedureName",
dbWrapper.CreateParameter("id", Header.VoyageID),
dbWrapper.CreateParameter("eta", ETA)
ETA は DateTime 値です。
public void ExecuteProcWithParams(string procName, params DbParameter[] parameters)
{
try
{
using (DbCommand cmd = db.CreateCommand())
{
cmd.Transaction = trans;
cmd.CommandText = procName;
cmd.CommandType = CommandType.StoredProcedure;
foreach (DbParameter param in parameters)
{
cmd.Parameters.Add(param);
}
cmd.ExecuteNonQuery();
}
}
catch (Exception)
{
throw;
}
}
public DbParameter CreateParameter(string name, object value)
{
DbParameter result = null;
switch (databaseType)
{
case DatabaseType.SqlServer:
// Sql Server: NULL parameters have to initialised with DBNull rather than NULL
result = new SqlParameter(name, value ?? DBNull.Value);
break;
default:
throw new Exception(String.Format("Unknown database type {0}", databaseType));
}
return result;
}