1

ここで私の構文の何が問題なのか誰でも知っていますか? 動的 eSQL クエリを作成していますが、DateTime データ型の where 条件を作成しようとするとエラーが発生します。これはエラーです:

クエリ構文が無効です。期近'2011'、1 行目、135 列目。

私のエンティティの DateTime 型が実際に null 許容の DateTime であることが重要な場合は?

しかし、私が読んだすべてのものから、これは正しい構文だと思いました。

コードは次のとおりです。

List<EntityFilter<FirstRead>> filters = new List<EntityFilter<FirstRead>>()
        {
            new EntityFilter<StudyFirstRead> { PropertyName = "username", OpType = ExpressionType.Equal, Value = "cwoodhouse" },
            new EntityFilter<StudyFirstRead> { PropertyName = "FirstRead", OpType = ExpressionType.LessThan, Value = "DATETIME'2011-02-01 00:00'" }
        };

EntityFilter の場所:

  public class EntityFilter<T>
{
    public string PropertyName { get; set; }
    public ExpressionType OpType { get; set; }
    public object Value { get; set; }

そして、私は次のような動的クエリを作成しています:

StringBuilder builder = new StringBuilder();

        int counter = 0;

        string baseStr = @"SELECT VALUE val FROM " + contextName + "." + tableName + " AS val WHERE val.";

        builder.Append(baseStr); 

        foreach (EntityFilter<T> filter in filters)
        {
            //builder.Append(filter.PropertyName + " " + filter.OpTypeString() + " @p" + counter);
            builder.Append(filter.PropertyName + " " + filter.OpTypeString() + "'" + filter.Value + "'"); 
            counter++;

            if (counter < filters.Count)
                builder.Append(" AND val."); 
            else
            {
                break; 
            }
        }

        return builder.ToString(); 
4

2 に答える 2

0

実際には、エンティティ SQL の正しい構文です (通常の SQL や T-SQL とは異なります)。

EntityFilter オブジェクトと動的クエリを作成したメソッドの両方に単一引用符が含まれていたため、問題は単一引用符が多すぎたことが判明しました。

于 2011-02-20T09:44:36.560 に答える
0

あなたのコードによれば、SQL文の終わりは次のようなものを生成します

AND val.FirstRead = 'DATETIME'2011-02-01 00:00''

実行するとエラーが発生します

エラー 102: '2011' 付近の構文が正しくありません。

明らかに、それは構文的に正しい SQL ではありません。簡単な修正は、フィルター コレクションを次のようにすることです。

List<EntityFilter<FirstRead>> filters = new List<EntityFilter<FirstRead>>() {
    new EntityFilter<StudyFirstRead> {
        PropertyName = "username",
        OpType = ExpressionType.Equal,
        Value = "cwoodhouse"
    }, new EntityFilter<StudyFirstRead> {
        PropertyName = "FirstRead",
        OpType = ExpressionType.LessThan,
        Value = "2011-02-01 00:00"
    }
};
于 2011-02-20T02:51:53.493 に答える