-1

このコード:

public bool IsValidColumn(string tableName, string columnName)
{
    //return true;// <-- when I uncomment this, I don't get the err msg (but I don't know whether it's a valid column or not, either)
    bool validColumn = false;
    string tblQuery = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tableName AND COLUMN_NAME = @columnName";
    checkConnection();
    try
    {
        SqlCeCommand cmd = objCon.CreateCommand();
        cmd.CommandText = tblQuery;
        SqlCeParameter tblNameParam = new SqlCeParameter("@tableName", SqlDbType.NVarChar, 128);
        tblNameParam.Value = tableName;
        cmd.Parameters.Add(tblNameParam);
        SqlCeParameter colNameParam = new SqlCeParameter("@columnName", SqlDbType.NVarChar, 128);
        colNameParam.Value = tableName;
        cmd.Parameters.Add(colNameParam);
        //int i = (int)cmd.ExecuteScalar();
        int i = 0;
        object obj = cmd.ExecuteScalar();
        if ((obj != null) && (obj != DBNull.Value)) 
        {
            i = Int32.Parse(obj.ToString());
            validColumn = i > 0;
        } 
        else 
        {
            MessageBox.Show("NULL returned from ExecuteScalar. Remove this line.");
        }
    }
    catch (SqlCeException sqlceex)
    {
        return false; 
    }
    catch (Exception ex)
    {
        return false;
    }
    return validColumn;
}

...ここの以前の回答から/に基づいて適応されました: C# を使用して SQL Server CE テーブルに列が存在するかどうかを確認するにはどうすればよいですか?

それでも、「クエリの解析中にエラーが発生しました。[トークン行番号、トークン行オフセット、トークンのエラー、、]」(ここで不満を言いました:この DDL の解析中にエラーが発生するのはなぜですか? 、なぜエンジンはそれを見つけることについてより具体的にできないのですか?そしてここに:

SQL Server CE の DDL パーサーは非常にうるさいですが、何に問題があるかについては秘密主義です)。

このエラーメッセージの原因を突き止めようとして、実際にレガシーコードをかなりリファクタリングしました (冷蔵庫からたくさんの腐ったスパゲッティを投げ出しました) ので、時間の無駄ではありませんでした。 、しかし今、そのエラーメッセージの原因は上記のコードにあることがわかりました。問題は、このエラー メッセージを生成せずに列が有効かどうかを判断するにはどうすればよいかということです。

4

1 に答える 1

1

あなたのコメントから、次のメッセージが表示されます。

SQL Server CE は並列トランザクションをサポートしていません。

トランザクション内にいる間に、コードがこのチェックを呼び出していると思います。トランザクションとは別にエラー チェックを行う必要がある場合があります。

私はしばらくの間トランザクションを使用していましたが、データベースへの単純な読み取り/書き込み操作には実際には必要ないことに気付きました。あなたの取引明細書を削除しても安全だと思いますが、それは単なる補足的なコメントです。

あなたのコードの多くがこれらの特殊なステートメントを使用していることに気付きました:

  • checkConnection()
  • objCon.CreateCommand()
  • isValidField.

これらは本当にあなたを助けていますか?

これらのルーチンを呼び出している場所はいくつありますか?

このエラー メッセージは、 を呼び出す前に、コード内の別の場所で別のトランザクションを既に開始しているように聞こえますIsValidColumn

IsValidColumnおそらく、トランザクションを開始する前に列が有効であることをすでに知っているように、コードを変更して早い段階 (プログラムの開始時など) にチェックすることができます。

于 2013-04-02T18:12:22.613 に答える