#c# #ado
#c# #ado
Вопрос:
У меня есть метод в консольном приложении c #, который передает строку имени хранимой процедуры и возвращает datatable.
public DataTable Table(int val,string ProcedureName)
{
string Pk = "@" ProcedureName "Id";
var command = GetCommand(ProcedureName);
command.Parameters[Pk].Value = val;
DataTable table = new DataTable();
SqlDataAdapter adapter = new SqlDataAdapter(command);
adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
adapter.Fill(table);
return table;
}
Вот код для вспомогательного метода getCommand
internal SqlCommand GetCommand(string ProcedureName)
{
SqlCommand cmd = new SqlCommand()
{
Connection = BuildingSecurityContext(),
CommandType = CommandType.StoredProcedure,
CommandText = ProcedureName
};
_BuildingSecurityContext.Open();
SqlCommandBuilder.DeriveParameters(cmd);
_BuildingSecurityContext.Close();
return cmd;
}
Вот метод, который выводит результаты на консоль.
static void ReadResults(DataTable table)
{
for (int i = 0; i < table.Rows.Count; i )
{
Console.WriteLine($"{table.Rows[i].Field<int>(0)}{table.Rows[i].Field<string>(1)}{table.Rows[i].Field<string>(2)}");
}
}
Проблема в том, что я получаю сообщение об ошибке, что он не может найти столбец 1. (Мне кажется, что команда не заполняет таблицу данных).
Может кто-нибудь указать мне, где я ошибаюсь?
Комментарии:
1. Было бы удобнее отлаживать, если бы вы поместили значения из таблицы в переменные? Затем вы сможете выполнять отладку и сможете видеть значения на этапе выполнения кода, и вам поможет intellisense. Первое, что я бы сделал, это подтвердил, что table.rows.count > 0 и count точны, и ваш sproc возвращает то, что должен.
Ответ №1:
параметры начинаются с @, но большинство процедур этого не делают — вы уверены, что хотите добавить знак @?
также эта строка не имеет смысла
command.Parameters[Pk].Value = val;