[英]SqlDataReader Best way to check for null values -sqlDataReader.IsDBNull vs DBNull.Value
[英]Using column name when using SqlDataReader.IsDBNull
我有這個從 SQL DB 讀取數據的代碼。
我不知道應該如何編輯它,以便可以使用原始列名而不是列索引。
string query = "SELECT * FROM zajezd WHERE event='" + thisrow+ "' AND year='" + klientClass.Year() + "'";
SqlCommand cmd= new SqlCommand(query, spojeni);
spojeni.Open();
SqlDataReader read= cmd.ExecuteReader();
if (read.Read())
{
maskedTextBox2.Text = read.IsDBNull(24) ?
string.Empty :
read.GetDateTime(24).ToString("MM/dd/yyyy");
根據 MSDN
獲取列序號,給定列的名稱。
if (read.Read())
{
int colIndex = read.GetOrdinal("MyColumnName");
maskedTextBox2.Text = read.IsDBNull(colIndex) ?
string.Empty :
read.GetDateTime(colIndex).ToString("MM/dd/yyyy");
}
附帶說明一下,您的查詢對 sql 注入是開放的。 不要使用字符串連接來構建 sql 命令,而是使用參數化查詢
string query = "SELECT * FROM zajezd WHERE event=@p1 AND year=@p2";
using(SqlCommand cmd= new SqlCommand(query, spojeni))
{
spojeni.Open();
cmd.Parameters.AddWithValue("@p1",thisrow);
cmd.Parameters.AddWithValue("@p2",klientClass.Year().ToString());
using(SqlDataReader read= cmd.ExecuteReader())
{
......
}
}
我會嘗試(string)(reader["ColumnName"] == DBNull.Value ? "" : reader["ColumnName"]);
通過列名來完成。
您可以使用GetOrdinal
創建自己的IsDBNull(string name)
擴展方法。
[DebuggerStepThrough]
public static class SqlDataReaderExtensions
{
/// <summary>Gets a value that indicates whether the column contains non-existent or missing values.</summary>
/// <param name="name">The name of the column. </param>
/// <returns> <see langword="true" /> if the specified column value is equivalent to <see cref="T:System.DBNull" />; otherwise <see langword="false" />.</returns>
/// <exception cref="T:System.IndexOutOfRangeException">The name specified is not a valid column name. </exception>
public static bool IsDBNull(this SqlDataReader reader, string name)
{
int columnOrdinal = reader.GetOrdinal(name);
return reader.IsDBNull(columnOrdinal);
}
}
// Usage
if (read.Read())
{
maskedTextBox2.Text = read.IsDBNull("MyColumnName") ?
string.Empty :
read.GetDateTime("MyColumnName").ToString("MM/dd/yyyy");
}
您可以將 GetOrdinal 與 isnull 屬性一起使用,如下所示:
SqlDataReader reader = await cmd.ExecuteReaderAsync();
model.fieldName = reader.IsDBNull(reader.GetOrdinal("fieldName")) ? false : Convert.ToBoolean(reader["fieldName"]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.