2

次のクラス メソッドを含む winforms アプリがあります。

public aSqlQuery(SqlCommand pSqlCom, string pMode = "object", bool pGetID = false)
    {
        try
        {
            string strConnection = aSystem.ConnectionString;
            SqlConnection linkToDB = new SqlConnection(strConnection);
            pSqlCom.Connection = linkToDB;

            switch (pMode)
            {
                case "non query":
                    {
                        linkToDB.Open();
                        pSqlCom.ExecuteNonQuery();
                        if (pGetID == true)
                        {
                            SqlCommand sqlCom = new SqlCommand("SELECT @@IDENTITY;", linkToDB);
                            this.LastID = (int)sqlCom.ExecuteScalar();
                        }
                        linkToDB.Close();
                    }
                    break;

プラス他のスイッチ

データベースに書き込まれたデータを確認できるため、pSqlCom (SqlCommand) は正常に実行されます。ただし、後続の「SELECT @@IDENTITY」ステートメントでは無効なキャスト エラーが発生します

4

3 に答える 3

1

行を挿入し、 で指定された Id を取得します。SCOPE_IDENTIY()使用しないでください@@IDENTITY

SCOPE_IDENTITY()の直後に、同じ接続とスコープで使用する必要がありますINSERT


あなたの例では、接続で noINSERTが実行されるため、最後に生成された ID を取得することは期待できません。

あなたの例では、 をpSqlCom実行することは明確ではありません。変換できないINSERTインデンティ関数が返されない場合NULLint


編集

使いSCOPE_IDENTITY()たいし、 と同じCommandようにやりたいINSERT

したがって、ステートメントは次のようになります

var sql =
@"INSERT <Your Data> <Your Table>;
SELECT SCOPE_IDENTIY();"

using (SqlConnection connection = new SqlConnection(strConnection))
{
    using (SqlCommand command = new SqlCommand(sql, connection))
    {
        connection.Open();
        object result = command.ExecuteScalar();
    }
}

int? id = (int?)(!Convert.IsDBNull(result) ? result : null);
于 2012-07-27T14:27:07.353 に答える
-1

正しい答えは、SELECT SCOPE_IDENTITY() ステートメントは、その前にある INSERT ステートメントと同じ SqlCommand の一部を形成する必要があったが、以前の SqlCommand 'pSqlCom' に含まれていたということでした。SELECT SCOPE_IDENTITY() が pSqlCom の一部として組み込まれると、コードは ID を正しく返しました。

于 2012-07-27T20:33:10.573 に答える
-2

コマンドの呼び出しは、スカラータイプではないものを返す必要があります。実際、代わりにInt32を使用する必要があります。MSDNのChekExecuteScalar

また、SCOPE_IDENTITY()の代わりに使用することをお勧めします@@Identity。詳細な説明については、次のリンクを確認してください。

于 2012-07-27T14:22:54.757 に答える