Sql reader为每一行返回DBnull

时间:2016-04-09 20:30:58

标签: c# sql-server dbnull

我正在尝试在我的网站上显示我的SQLSEVER数据库中的图片。我的用户有一个图片数据类型的图片字段。如果图片列为空,那么我希望显示的图片是egg.jpg,但现在每个人的图片都是egg.jpg,即使他们在数据库中有图片。这是我的方法。

 public string getImageUrl()
      {
    System.Data.SqlClient.SqlConnection sc = new              System.Data.SqlClient.SqlConnection();

    sc.ConnectionString = "Server =MRCOMPUTER2\\SQLEXPRESS; Database = WBL;Trusted_Connection=Yes;";
    sc.Open();
    System.Data.SqlClient.SqlCommand insert = new System.Data.SqlClient.SqlCommand();
    insert.Connection = sc;
    insert.CommandText = "SELECT profilePicture from SystemUser";

    insert.ExecuteNonQuery();
    SqlDataReader reader = insert.ExecuteReader();
    string url = "";
    while (reader.Read())
    {

        if ( !DBNull.Value.Equals(reader[0]))
        {
            url = "data:Image / png; base64," + Convert.ToBase64String((byte[])reader[0]);

        }

        else {

            url = "images/egg.jpg";
        } 

    }
    return url; 

}

4 个答案:

答案 0 :(得分:1)

您的代码会返回表格中 last 用户的图片。

下面:

insert.CommandText = "SELECT profilePicture from SystemUser";

从表格中选择所有用户(而不仅仅是您当前显示的用户)。然后:

while (reader.Read())
{
    ...
    url = ...
    ...
}

在你的while循环的每次迭代中重新分配 url。这在语义上等同于:

url = ... /* The value determined from the last record of the reader. */

因此,您的所有用户都会显示相同的图片 - 表格中 last 用户之一。

答案 1 :(得分:0)

您可以尝试使用列的名称,例如

var Val = (String)reader["column name"];

另外,尝试这样的测试:

while (reader.Read())
            {

                var testVal = reader.GetString(0);
                Var testVal2 = reader.GetString(1);

答案 2 :(得分:0)

您的SELECT语句是否附加到ExecuteNonQuery?

脱掉它。

只需执行READER语句......

答案 3 :(得分:0)

试试这个:

        static void Main(string[] args)
        {
            string connectionString = "Server=.;Database=AA;Trusted_Connection=True;";

            /*
            CREATE TABLE [dbo].[SystemUser]
            (
                [ProfilePicture] [varbinary](max) NULL
            )
            */

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                string sql = @"
INSERT [AA].[dbo].[SystemUser] ([ProfilePicture]) VALUES (@ProfilePicture);
INSERT [AA].[dbo].[SystemUser] ([ProfilePicture]) VALUES (NULL);
";

                SqlCommand command = new SqlCommand();
                command.Connection = connection;
                command.CommandText = sql;
                command.CommandType = CommandType.Text;

                byte[] bytes = File.ReadAllBytes(@"1.jpg");
                command.Parameters.AddWithValue("@ProfilePicture", bytes);

                connection.Open();
                command.ExecuteNonQuery();
            }


            DataSet ds = new DataSet();
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                string sql = @"
SELECT TOP 1000 [ProfilePicture] FROM [AA].[dbo].[SystemUser];
";

                SqlCommand command = new SqlCommand();
                command.Connection = connection;
                command.CommandText = sql;
                command.CommandType = CommandType.Text;

                connection.Open();
                SqlDataAdapter da = new SqlDataAdapter(command);
                da.Fill(ds);
            }

            var rows = ds.Tables[0].Rows.Cast<DataRow>();
            foreach (DataRow row in rows)
            {
                byte[] bytes = row.Field<byte[]>(0);
                if (bytes != null)
                {
                    string fileName = Guid.NewGuid().ToString("N") + ".jpg";
                    File.WriteAllBytes(fileName, bytes);
                }
            }
        }