#c# #mysql #visual-studio
#c# #mysql #visual-studio
Вопрос:
Я просматриваю две формы, которые заполняют данные из базы данных, и я получаю ошибку «не удалось найти подготовленный оператор с дескриптором 1» в одной из них. Основываясь на том, что я собрал из других сообщений, эта ошибка обычно вызывается либо версией SQL express, запущенной на их компьютерах, и / или версией .Они используют NET framework.
Оба оператора являются подготовленными операторами выбора и очень похожи друг на друга, но только первый выдает ошибку.
Помимо задействованных таблиц и данных, единственное реальное различие между ними заключается в том, что первый (тот, который выдает ошибку) также заполняется из простого цикла for (7 раз), в котором один из параметров увеличивается на единицу.
Есть ли что-то, чего мне не хватает? Существуют ли какие-либо другие возможные причины, по которым эта ошибка возникает помимо версии SQL / .NET framework, используемой машиной?
Code1 выдает «не удалось найти подготовленный оператор с дескриптором 1»
c.Open();
SqlCommand command = new SqlCommand(null, c);
command.CommandText = @"SELECT Patient.patientName ' Gender:' Patient.gender AS patient, Patient.patientName ' [' Patient.gender '' CAST(CAST(DATEDIFF(hour, Patient.birthdate, GETDATE()) / 8766.0 AS DECIMAL(4, 1)) AS VARCHAR(6)) ']' AS patientSum, Patient.school, Patient.diagnosis, Patient.notes, Staff.staffName, Department.depName, Timeslot.time, CONVERT(VARCHAR(6), Schedule.date, 7) AS SchedDate, Schedule.notes, Contact.contactName, Contact.contactNo, Contact.email, Schedule.schedule_ID, Timeslot.timeslot_ID
FROM Timeslot LEFT OUTER JOIN Schedule ON (Timeslot.timeslot_ID = Schedule.timeslot_ID) AND (Schedule.date = @scheduleDate) AND Schedule.staff_ID = @scheduleStaff_ID
LEFT OUTER JOIN Staff ON Schedule.staff_ID = Staff.staff_ID
LEFT OUTER JOIN Department ON Staff.dep_ID = Department.dep_ID
LEFT OUTER JOIN Patient ON Schedule.patient_ID = Patient.patient_ID
LEFT OUTER JOIN Contact ON Patient.contact_ID = Contact.contact_ID;";
command.Parameters.Add("@scheduleDate", SqlDbType.Date).Value = weekArray[ctr];
command.Parameters.Add("@scheduleStaff_ID", SqlDbType.Int).Value = comboBox2.SelectedValue;
command.Prepare();
command.ExecuteReader();
SqlDataAdapter a = new SqlDataAdapter(command);
c.Close();
У Code2 нет проблем
c.Open();
SqlCommand command = new SqlCommand(null, c);
command.CommandText = @"SELECT Patient.patient_ID, Patient.patientName, Patient.gender, CAST(DATEDIFF(hour, Patient.birthdate, GETDATE()) / 8766.0 AS DECIMAL(4, 1)) AS Age, Patient.birthdate, Patient.diagnosis, Patient.notes, Patient.school, Patient.referredBy, Patient.lastVisit, Patient.contact_ID, Contact.contactName, Contact.email, Contact.contactNo
FROM Patient INNER JOIN Contact ON Patient.contact_ID = Contact.contact_ID
WHERE Patient.patientName LIKE '%' @patientName '%'
OR Patient.diagnosis LIKE '%' @diagnosis '%'
OR Patient.notes LIKE '%' @notes '%'
ORDER BY Patient.patientName;";
command.Parameters.Add("@patientName", SqlDbType.VarChar, 50).Value = textBox1.Text;
command.Parameters.Add("@diagnosis", SqlDbType.VarChar, 250).Value = textBox1.Text;
command.Parameters.Add("@notes", SqlDbType.VarChar, 250).Value = textBox1.Text;
command.Prepare();
command.ExecuteReader();
SqlDataAdapter a = new SqlDataAdapter(command);
c.Close();
Кстати, я должен отметить, что ошибка возникает только на других машинах без установленной Visual Studio, та, которую я использую для разработки, вообще не выдает ошибок (все предварительные условия включены в установку, т.Е. .net framework, sql, powerpacks и т. Д.)
Комментарии:
1. подготовка полностью необязательна, работает ли она, если вы закомментируете строку?
2. На самом деле, когда вы закрываете соединение сразу после вызова, нет особого смысла вызывать .prepare()
3. Я не знаю, достаточно ли разумны параметры команды, но вы пытаетесь вставить текстовое значение (comboBox2.SelectedValue (является строкой?)) и пометить его как целое число?
4. Значение представляет собой целое число (идентификатор), в то время как отображаемый текст является текстом. Для других параметров команды, если вам интересно, почему все они используют похожее текстовое поле, причина в том, чтобы просто позволить пользователю искать совпадение в любом из трех столбцов. Я мог бы использовать один командный параметр для всех трех из них, но просто закодировал его таким образом только потому, что он «чувствует» себя более организованным.
5. @Alex K. Да, это сработало. Есть какие-либо мысли относительно того, почему мне было необходимо удалить .prepare в code1, но не в code2, хотя это было просто необязательно? Кроме того, пожалуйста, отправьте его в качестве ответа, большое спасибо!