-1

このコードを使用して、パラメーターcategoryNameに対応するテーブルでidを検索します。存在しない場合は、テーブルに値を挿入してからキーを返します。が実行されるlong idCategory = (long) id;と、動作する場合と無効なキャスト例外がスローされる場合があります。どうして???

    public static long GetCategoryID(String categoryName)
    {
        using (NpgsqlConnection conn = new   NpgsqlConnection(ConfigurationManager.ConnectionStrings["myConn"].ToString()))
        {
            conn.Open();
            NpgsqlTransaction transaction = conn.BeginTransaction();


            String query = "SELECT idcategory FROM category WHERE categoryname = '" + categoryName + "';";

            NpgsqlCommand cmd = new NpgsqlCommand(query, conn, transaction);


            object id = cmd.ExecuteScalar();

            if (id == null)
            {
                query = "INSERT INTO Category (categoryname) VALUES ('" + categoryName +"');";
                cmd = new NpgsqlCommand(query, conn, transaction);
                cmd.ExecuteNonQuery();

                query = "SELECT LASTVAL();";
                cmd = new NpgsqlCommand(query, conn, transaction);
                id = cmd.ExecuteScalar();
            }

            long idCategory = (long)id;

            transaction.Commit();
            conn.Close();

            return idCategory;
        }
    }
4

1 に答える 1

0

まず、デバッガーを使用idして、例外が発生する の値を確認してください。これは、問題を見つけるのに役立つ場合があります。

また、テーブル「category」の列「idcategory」のid型とデータ型を確認してくださいこれらのデータ型には違いがあり、例外が発生する可能性があります。

「idcategory」が自動的に挿入されない可能性もあるため、 INSERTステートメントに含める必要があります。( 'SELECT LASTVAL()'はnullを返しますか?)

それとは別に、私は常によりも好むでしょlong idCategory = Convert.ToInt64(id)long idCategory = (long)id

例外を回避したい場合は、以下を使用long idCategory = id as longして確認してくださいidCategory == null

于 2013-02-15T14:19:36.617 に答える