Я обновляю старый проект, перемещая его источник данных из Sybase на SQL Сервер. Структуры данных идентичны (они обе являются копиями коммерческой базы данных - версия Sybase больше не поддерживается).
Поскольку она довольно старая, для подключения используется ODB C. Строки подключения изначально указали DSN. Мне удалось подключиться к SQL серверу, используя как необработанную строку подключения, так и заменяющий DSN.
Он выполняет код для базы данных, вытягивая текст команды из файла конфигурации и добавляя именованные параметры, например, так :
var args = new Dictionary<string, object>()
{
{ "@myFirstParam", "myFirstValue" },
{ "@mySecondParam", "mySecondValue" }
}
IDbCommand cmd = Connection.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandTimeout = Command.Timeout;
cmd.CreateParameters(Command.Parameters, args);
cmd.CommandText = [fetched from config]
IDataReader reader = null;
reader = cmd.ExecuteReader();
Все это нормально работало с Sybase.
Однако, когда я запускаю его с SQL, когда читатель запускается, я получаю следующую ошибку:
ОШИБКА [42000] [Microsoft] [ODB C Драйвер 17 для SQL Сервер] [SQL Сервер] Необходимо объявить скалярную переменную "@myFirstVariable".
Я получаю эту ошибку, указываю ли я соединение как DSN или необработанную строку. Шагая по коду, параметр, безусловно, объявлен и имеет допустимое значение.
Читая об этом, кажется, что такое поведение следует ожидать. Документация Microsoft по соединению ODB C гласит, что вы можете использовать именованные параметры, только если вы вызываете хранимую процедуру, а я нет. Видимо, правильный метод - поставить "?" символы в тексте команды и ODB C вставят параметры по индексу.
Если это правильно, я понятия не имею, как этот код работал с Sybase. У меня есть другой проект, который использует тот же код для загрузки данных, указывая именованные параметры и передавая их в команду SQL, указанную в config, но он указывает на другую SQL серверную базу данных.
Я предполагаю, что это может быть что-то делать с конфигурацией базы данных, но я довольно потерян, что попробовать здесь. Любые предложения будут с благодарностью.