Я обновляю старый старый код, и у меня возникла проблема с методом SqlCommand.ExecuteReader(). Проблема в том, что он не возвращает никаких результатов. Однако, используя SqlDataAdapter.Fill(), я возвращаю результаты из базы данных. Что я делаю не так? Как я могу получить результаты с помощью устройства чтения данных?
var connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ToString();
using (var sqlConnection = new SqlConnection(connectionString))
{
using (var sqlCommand = new SqlCommand())
{
sqlCommand.Connection = sqlConnection;
sqlCommand.CommandType = CommandType.Text;
sqlCommand.CommandText = "SELECT * FROM MyTable WHERE ID = 1";
sqlConnection.Open();
// This code works.
//var dataTable = new DataTable();
//using (var sqlDataAdapter = new SqlDataAdapter(sqlCommand))
//{
// sqlDataAdapter.Fill(dataTable);
//}
// This code is not working.
using (var sqlDataReader = sqlCommand.ExecuteReader())
{
while (sqlDataReader.Read())
{
// This fails because the data reader has no results.
var id = sqlDataReader.GetInt32(0);
}
}
}
}
Может быть, нет Int32
в ваших результатах?
var id = sqlDataReader.GetInt32(0); // <-- this might not be an Int32
Попробуйте:
var id = sqlDataReader.GetValue(0);
Или применить к правильному типу (например, BIGINT
- Int64
), не уверен, не видя ваши данные.
int
- это не то же самое, что вызов GetInt32()
оно не будет работать, если не будет точного совпадения типов, когда приведение короткого к int приемлемо. GetInt32()
ли GetInt32()
исключение при вызове?
Попробуй это..
var id = 0;
using (var sqlDataReader = sqlCommand.ExecuteReader())
{
while (sqlDataReader.Read())
{
id = sqlDataReader.GetInt32(sqlDataReader.GetOrdinal("ColName"));
}
}
Я переместил переменную за пределы кода считывателя, или переменная будет доступна только внутри этой области. Я бы не стал указывать порядковый номер в коде, если кто-то изменил столбцы в БД.
Кроме того, укажите столбцы в инструкции SQL... SELECT ColName FROM...
и используйте параметры в запросе
Если вы добрались до этой линии, то результаты
Не означает, что значение не равно нулю
И вы не должны использовать SELECT *
Если может возникнуть проблема с неявным литьем
Попробуйте Int32
try
{
if(sqlDataReader.IsDBNull(0))
{
// deal with null
}
else
{
Int32 id = sqlDataReader.GetInt32(0);
}
}
catch (SQLexception Ex)
{
Debug.WriteLine(Ex.message);
}
var connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ToString();
using (var sqlConnection = new SqlConnection(connectionString))
{
sqlConnection.Open();
string sql = "SELECT * FROM MyTable WHERE ID = 1";
using (var sqlCommand = new SqlCommand(sql, sqlConnection))
{
using (var sqlDataReader = sqlCommand.ExecuteReader())
{
while (sqlDataReader.Read())
{
// This fails because the data reader has no results.
var id = sqlDataReader.GetInt32(0);
}
}
}
}
sqlDataReader.GetValue(0)
? Это возвращает данные?