1

私は2つのテーブルを持っています。簡単にするために、それらがこのように定義されていると仮定しましょう

Stack 
{
    ID       int  Primary Key
    Name     varchar(255), not null
}

User
{
    ID           int  Primary Key
    Name         varchar(255), not null
    Stack_ID     int, Foreign Key to Stack.ID nulls are allowed
}

ユーザーを挿入するためのストアド プロシージャは次のようになります。

CREATE PROCEDURE usp_insertUser
    @id int,
    @name varchar(255),
    @stackID int
AS
    INSERT INTO User (ID, Name, Stack_ID) VALUES (@id, @name, @stackID)
GO

私のモデルレイヤーでは、私のユーザークラスでは、nullable を使用して StackID を保持しています

public class User
{
     public int ID {get; set;}
     public string Name {get; set;}
     int? Stack_ID {get; set;}
}

私のデータアクセスレイヤーはかなり標準的だと思っていましたが、問題が発生しました.InsertUserメソッドはこれに似ています

 public void InsertUser(User entity)
 {
     ...
     using (SqlCommand command = new SqlCommand())
     {
         command.Connection = conn;
         command.CommandType = System.Data.CommandType.StoredProcedure;
         command.CommandText = "usp_insertUser";

         command.Parameters.AddWithValue("@id", entity.ID);
         command.Parameters.AddWithValue("@name", entity.Name);
         command.Parameters.AddWithValue("@stackID", entity.Stack_ID);
         conn.Open();
         ...
         //real stored proc returns the id of the item inserted so i use a reader
         SqlDataReader reader = command.ExecuteReader();
         ....
    }
 }

ここでの私の問題は、User.Stack_ID を null のままにすると、データベースに null が挿入されず、代わりに @stackID が期待されていたが存在しなかったというエラーが表示されることです。この nullable int をデータベースに直接挿入できないのはなぜですか?

また、データベースからこの可能な null int を読み取ることができる 1 行の方法はありますか?

私がこれをしたとき、私はこれがうまくいくと思いました。

User.Stack_ID = (int?)reader["Stack_ID"];

それは明らかにうまくいかず、次のようなずさんなことをしなければなりません

try {
   User.StackID = (int)reader["Stack_ID"];
}
catch {
   User.StackID = null;
}

これらの Nullable 型を使用する際の助けをいただければ幸いです。noob の質問で申し訳ありません。過去に int があり、null 値が必要だった場合、またはそれらを -1 または 0 などに設定していた場合、それらが外部キーの場合は機能しません :-(

4

3 に答える 3

2
command.Parameters.AddWithValue("@stackID", entity.Stack_ID ?? (object) DBNull.Value);

null 値を読み取るには、次のようにします。

User.StackID = reader.Field<int?>("Stack_ID");

これはField拡張メソッドを使用します。MSDN から:

Field メソッドは、null 許容型として列にアクセスするためのサポートを提供します。DataSet の基になる値が [DBNull.]Value の場合、返される null 許容型の値は null になります。

于 2012-07-10T18:29:12.573 に答える
0

DBNullデータベースにヌルを挿入するために呼び出される特別なタイプがあります。

試す

command.Parameters.AddWithValue("@stackID", entity.Stack_ID.HasValue ? entity.StackId : DBNull.Value);
于 2012-07-10T18:29:42.833 に答える
0

最も簡単な方法は、 を使用することasです。

int? myNullableInt = reader["Stack_ID"] as int?;

これに対する注意点reader["Stack_ID"]は、 が異なるデータ型 (文字列、10 進数など) の場合、例外ではなく null を取得することです。

編集:データベースへの挿入に関しては、を使用して挿入する場合command.Parameters.Add、データ型を変更する必要はありません。null 許容値がサポートされます。

于 2012-07-10T18:30:16.990 に答える