3

C# と SQL Server を使用して ASP.NET MVC 4 を使用しています

次の表からデータの行を選択しています

CREATE TABLE [dbo].[Mem_Basic] (
[Id]          INT           IDENTITY (1, 1) NOT NULL,
[Mem_NA]      VARCHAR (100) NOT NULL,
[Mem_Occ]     VARCHAR (200) NOT NULL,
[Mem_Role]    VARCHAR (200) NOT NULL,
[Mem_Email]   VARCHAR (50)  NULL,
[Mem_MPh]     VARCHAR (15)  NULL,
[Mem_DOB]     DATE          NULL,
[Mem_BGr]     NCHAR (10)    NULL,
[Mem_WAnn]    DATE          NULL,
[Mem_Spouse]  VARCHAR (75)  NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);

次のコードを使用して

public MemberBasicData GetMemberProfile(int id)
{
        MemberBasicData mb = new MemberBasicData();
        using (SqlConnection con = new SqlConnection(Config.ConnectionString))
        {
            using (SqlCommand cmd = new SqlCommand("SELECT * FROM Mem_Basic WHERE Id="+id+"", con))
            {
                try
                {
                    con.Open();
                    SqlDataReader reader = cmd.ExecuteReader();
                   if(reader.Read()==true)
                    {
                        mb.Id = (int)reader["Id"];
                        mb.Mem_NA = (string)reader["Mem_NA"];
                        mb.Mem_Occ = (string)reader["Mem_Occ"];
                        mb.Mem_Role = (string)reader["Mem_Role"];
                        mb.Mem_Email = (string)reader["Mem_Email"];
                        mb.Mem_MPh = (string)reader["Mem_MPh"];
                        mb.Mem_DOB = (Convert.ToDateTime(reader["Mem_DOB"]));
                        mb.Mem_BGr = (string)reader["Mem_BGr"];
                        mb.Mem_WAnn = (Convert.ToDateTime(reader["Mem_WAnn"]));
                        mb.Mem_Spouse = (string)reader["Mem_Spouse"];
                   }
                }
                catch (Exception e) { throw e; }
                finally { if (con.State == System.Data.ConnectionState.Open) con.Close(); }
            } 
        }
        return mb;
    }

これはエラーを示しています

タイプ 'System.DBNull' のオブジェクトをタイプ 'System.String' にキャストできません。

( Mem_EmailMPh..などにはNULL値が含まれることがあります..値がnullの場合はnullを返したい)。誰でも私を助けてください。

4

6 に答える 6

3

dapper ( http://www.nuget.org/packages/Dapper )のようなツールを使用すると、ここでかなりの労力を節約できます。

public MemberBasicData GetMemberProfile(int id)
{
    using (var con = new SqlConnection(Config.ConnectionString))
    {
        return con.Query<MemberBasicData>(
            "SELECT * FROM Mem_Basic WHERE Id=@id",
            new { id } // full parameterization, done the easy way
        ).FirstOrDefault();
    }
}

これが行うこと:

  • (パフォーマンスと安全性の両方のために)正しいパラメータ化を行いますが、不都合はありません
  • すべての実体化を行い、(パラメーターと列の両方で) null を処理します
  • めちゃくちゃ最適化されています(基本的に、間違いが少ないことを除けば、すべてのコードを自分で書くのと測定可能なほど同じ速度です)
于 2013-08-30T08:21:14.843 に答える
2

Alternatively to King King's answer you can write code like this:

mb.Mem_Email = reader["Mem_Email"] as string;

For value types, if the column allows nulls, it's a good practice to map them to nullable value types in C# so that this code reader["Mem_DOB"] as DateTime? works

于 2013-08-30T08:22:41.627 に答える
0

Change for all columns, that might be NULL from this

mb.Mem_NA = (string)reader["Mem_NA"];

to that

mb.Mem_NA = reader["Mem_NA"].ToString();
于 2013-08-30T08:22:25.353 に答える
0

Treat the nullable fields:

mb.Mem_Email = System.DBNull.Value.Equals(reader["Mem_Email"])?"":
                                      (string)reader["Mem_Email"];

Do the same for: mb.Mem_MPh, mb.Mem_BGr and mb.Mem_Spouse.

于 2013-08-30T08:22:58.300 に答える