私は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 などに設定していた場合、それらが外部キーの場合は機能しません :-(