Инструкция DBNull if
Я пытаюсь выполнить хранимую процедуру, а затем использовать оператор if для проверки значений null, и я заканчиваю. Я парень 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-соединение только значение, и если да, то заполняет мою строку?
Я привык к возможности просто проверить ниже, чтобы увидеть, возвращается ли значение, и не уверен, что я делаю это правильно с В C#
если не IsDBNull (rsData ("usr.ursrdaystime"))
любая помощь будет оценили!
8 ответов
Это должно работать.
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();
}
}
}
}
}
это автоматически утилизирует (закрывает) ресурсы за пределами блока { .. }.
идиоматический способ сказать:
if(rsData["usr.ursrdaystime"] != DBNull.Value) {
strLevel = rsData["usr.ursrdaystime"].ToString();
}
Это:
rsData = objCmd.ExecuteReader();
rsData.Read();
делает вид, что Вы читаете ровно одно значение. Использовать IDbCommand.ExecuteScalar
вместо.
да, просто проблема синтаксиса. Попробуйте вместо этого:
if (reader["usr.ursrdaystime"] != DBNull.Value)
.Equals()
проверяет, если два экземпляра Объекта того же.
ближайший эквивалент вашего VB будет (посмотреть этот):
Convert.IsDBNull()
но есть ряд способов сделать это, и большинство из них связаны отсюда
считаем:
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
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
Я использую строку.IsNullorEmpty часто. Это будет работать, потому что, когда DBNull установлен.ToString возвращает пустой.
if(!(String.IsNullorEmpty(rsData["usr.ursrdaystime"].toString())){
strLevel = rsData["usr.ursrdaystime"].toString();
}
сначала используйте ExecuteScalar
objConn = new SqlConnection(strConnection);
objConn.Open();
objCmd = new SqlCommand(strSQL, objConn);
object result = cmd.ExecuteScalar();
if(result == null)
strLevel = "";
else
strLevel = result.ToString();