Оператор DBNull if
Я пытаюсь выполнить хранимую процедуру, а затем использовать оператор if для проверки нулевых значений, и я немного отстаю. Я парень VB, поэтому, пожалуйста, со мной, если я сделаю синтаксическую ошибку школьника.
objConn = new SqlConnection(strConnection);
objConn.Open();
objCmd = new SqlCommand(strSQL, objConn);
rsData = objCmd.ExecuteReader();
rsData.Read();
if (!(rsData["usr.ursrdaystime"].Equals(System.DBNull.Value)))
{
strLevel = rsData["usr.ursrdaystime"].ToString();
}
Позволяет ли я проверить, возвращает ли SQL-соединение только значение, и если да, то заполнение моей строки?
Я привык к тому, чтобы просто проверить ниже, чтобы увидеть, возвращается ли значение и не уверен, что я делаю это правильно с помощью С#
Если Not IsDBNull (rsData ( "usr.ursrdaystime" ))
Любая помощь будет оценена!
Ответы
Ответ 1
Это должно сработать.
if (rsData["usr.ursrdaystime"] != System.DBNull.Value))
{
strLevel = rsData["usr.ursrdaystime"].ToString();
}
также нужно добавить оператор using, например, ниже:
using (var objConn = new SqlConnection(strConnection))
{
objConn.Open();
using (var objCmd = new SqlCommand(strSQL, objConn))
{
using (var rsData = objCmd.ExecuteReader())
{
while (rsData.Read())
{
if (rsData["usr.ursrdaystime"] != System.DBNull.Value)
{
strLevel = rsData["usr.ursrdaystime"].ToString();
}
}
}
}
}
это автоматически утилизирует (закрывает) ресурсы за пределами блока {..}.
Ответ 2
Идиоматический способ состоит в том, чтобы сказать:
if(rsData["usr.ursrdaystime"] != DBNull.Value) {
strLevel = rsData["usr.ursrdaystime"].ToString();
}
Это:
rsData = objCmd.ExecuteReader();
rsData.Read();
Делает вид, будто вы читаете ровно одно значение. Вместо этого используйте IDbCommand.ExecuteScalar
.
Ответ 3
Да, просто проблема синтаксиса. Вместо этого попробуйте:
if (reader["usr.ursrdaystime"] != DBNull.Value)
.Equals()
проверяет, является ли два экземпляра объекта одинаковыми.
Ответ 4
Рассмотрим:
if(rsData.Read()) {
int index = rsData.GetOrdinal("columnName"); // I expect, just "ursrdaystime"
if(rsData.IsDBNull(index)) {
// is a null
} else {
// access the value via any of the rsData.Get*(index) methods
}
} else {
// no row returned
}
Также: вам нужно больше using
; p
Ответ 5
Ближайшим эквивалентом вашего VB будет (см. это):
Convert.IsDBNull()
Но есть несколько способов сделать это, и большинство из них связаны отсюда
Ответ 6
if(!rsData.IsDBNull(rsData.GetOrdinal("usr.ursrdaystime")))
{
strLevel = rsData.GetString("usr.ursrdaystime");
}
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.isdbnull.aspx
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx
Ответ 7
Я часто использую String.IsNullorEmpty. Это сработает, потому что когда DBNull установлен в .ToString, он возвращает пустой.
if(!(String.IsNullorEmpty(rsData["usr.ursrdaystime"].toString())){
strLevel = rsData["usr.ursrdaystime"].toString();
}
Ответ 8
Сначала используйте ExecuteScalar
objConn = new SqlConnection(strConnection);
objConn.Open();
objCmd = new SqlCommand(strSQL, objConn);
object result = cmd.ExecuteScalar();
if(result == null)
strLevel = "";
else
strLevel = result.ToString();