16

您好,我有这个从 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");

提前致谢。

4

4 回答 4

23

您正在寻找SqlDataReader.GetOrdinal

根据 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())
     {
       ......
     }
  }
于 2013-09-27T19:42:30.530 回答
9

我会尝试(string)(reader["ColumnName"] == DBNull.Value ? "" : reader["ColumnName"]);通过列名来做到这一点。

于 2013-09-27T19:42:43.763 回答
1

您可以使用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");

}
于 2019-01-15T14:52:12.347 回答
-1

您可以将 GetOrdinal 与 isnull 属性一起使用,如下所示:

SqlDataReader reader = await cmd.ExecuteReaderAsync();
model.fieldName = reader.IsDBNull(reader.GetOrdinal("fieldName")) ? false : Convert.ToBoolean(reader["fieldName"]);
于 2019-11-08T19:09:41.783 回答