1

プロジェクトにCoolStorageを実装しようとしていますが、日付パラメーターを使用すると問題が発生します。日付パラメーターとしてnullを渡すと、レコードが正常に追加されますが、実際の日付を渡すと、.Save()を呼び出して新しいレコードをデータベースに書き込むときにエラーが発生します。(Activa)CoolStorageソースコードを入手し、失敗するポイントを見つけましたが、修正方法がわかりません。

失敗するコードは次のとおりです(具体的にdbCommand.ExecuteNonQuery()は行)。

internal int ExecuteNonQuery(string sqlQuery, CSParameterCollection parameters)
{
    long logId = Log(sqlQuery, parameters);

    IDbCommand dbCommand = CreateCommand(sqlQuery, parameters);

    try
    {
        dbCommand.ExecuteNonQuery();

        return 1;
    }
    catch (InvalidOperationException)
    {
        return -1;
    }
    finally
    {
        LogEnd(logId);
    }
}

sqlQueryには次のものが含まれます。

insert into [Schedule] ([TaskID],[StartTime],[MondayYn],[TuesdayYn],[WednesdayYn],[ThursdayYn],[FridayYn],[SaturdayYn],[SundayYn],[DefaultSysuserID],[DefaultTeamID],[ActiveYn]) 
values (@P17,@P18,@P19,@P20,@P21,@P22,@P23,@P24,@P25,@P26,@P27,@P28)

@ P18には、問題のある日付が含まれています。これは、値が次のCSParameterオブジェクトです。

{17/12/2012 18:52:44}

また、使用されているデータベースはAccessです。スローされるエラーは、 {"条件式のデータ型の不一致"}を読み取るOldDbExceptionです。

誰かがこれを解決する方法について何かアドバイスを提供できますか?

編集: Schedule StartTimeフィールドは、ScheduleテーブルでDate/Timeとして定義されています。必要なプロパティをTrueに設定する必要がありますが、StartTimeを省略してレコードの追加をテストするために、無効にしています。パラメータは、CoolStorageクラスを介して次のように適用されます。

Schedule schedule = Schedule.New();
schedule.TaskID = task.TaskID;
schedule.StartTime = DateTime.Now;
schedule.MondayYn = true;
schedule.TuesdayYn = true;
schedule.WednesdayYn = true;
schedule.ThursdayYn = true;
schedule.FridayYn = true;
schedule.SaturdayYn = false;
schedule.SundayYn = false;
schedule.DefaultSysuserID = sysuser.SysuserID;
schedule.DefaultTeamID = sysuser.SysuserTeams.First().TeamID;
schedule.ActiveYn = true;
schedule.Save();

Schedule.StartTime = DateTime.Now行をコメントアウトすると、レコードを正常に追加できます。そうしないと、上記のエラーが発生します。ORMマッピングクラスを編集せずにフォーマットをテキストに変更することはできません。これにより、他の場所でエラーが発生することは間違いありません。CoolStorage DataProviderクラスを変更できると思いますが、これは必要ないと思いますか?

EDIT2:テストとして、上記のSQLをインターセプトして、@ P18参照を削除し、その場所に日付をハードコーディングして、レコードを正しく追加しました。

insert into [Schedule] ([TaskID],[StartTime],[MondayYn],[TuesdayYn],[WednesdayYn],[ThursdayYn],[FridayYn],[SaturdayYn],[SundayYn],[DefaultSysuserID],[DefaultTeamID],[ActiveYn]) 
values (@P17,#2012-12-01 12:00:00#,@P19,@P20,@P21,@P22,@P23,@P24,@P25,@P26,@P27,@P28)

また、パラメーターの値を#yyyy-MM-dd hh:mm:ss#の形式の文字列としてキャストして変更しようとしましたが、基準式エラーでデータ型の不一致が発生しました。

EDIT3: CSParameterCollectionクラスを次のように修正して、DateTimeを文字列に変換するというAbhishek(edit-Dean)の提案に従って修正しました。別のデータベースを使用することにした場合、これで問題が発生しないことを願っていますが、Access用に修正されています。

public CSParameter this[string name]
{
    get
    {
        CSParameter parameter;

        _parameterMap.TryGetValue(name, out parameter);

        if (parameter.Value.GetType().Equals(typeof(DateTime)))
        {
            DateTime date = (DateTime)parameter.Value;
            string dateString = date.ToString("yyyy-MM-dd hh:mm:ss");
            parameter.Value = dateString;
        }

        return parameter;
    }
}
4

1 に答える 1

2

パラメータコレクションに追加するときにパラメータが同じ順序になっていないことが問題だと強く感じています。

それらが同じ順序になっていることを確認してください。これは、SQLステートメントまたはストアドプロシージャの両方に適用されます。

ADO.NETは、OLEDBプロバイダーを使用する場合、名前付きパラメーターをサポートしていません。また、Access DBに接続しているため、実際にはOLEDBプロバイダーを使用しています。したがって、パラメータの順序は重要です。

それらが正常であり、それでも機能しない場合は、DateTimeの問題である可能性があると思います。パラメータとして追加する前に、文字列に変換してみてください。

于 2012-12-17T20:42:03.700 に答える