Я хочу показать все книги выбранных писателей из списка отмеченных на диаграмме. Проблема в том, что мне нужно объединить два столбца, и это выдает исключение в строке da.Fill(dt1): Недопустимое имя столбца ime_prezime
conn.Open();
//chart1.Series.Clear();
//string predmeti = "";
string result = "";
string[] sAutori;
foreach (object itemChecked in checkedListBox1.CheckedItems)
{
DataRowView castedItem = itemChecked as DataRowView;
string companyName = (string)castedItem["ime_prezime"];
//int? id = castedItem["autor_id"];
result += $@"'({companyName})'" + ",";
}
if (checkedListBox1.CheckedItems.Count < 2)
{
MessageBox.Show("Morate izabrati bar dva pisca!");
}
else
{
result = result.Substring(0, result.Length - 1);
//string result = predmeti.Substring(0, predmeti.Length - 1);
cmd1.CommandText = $@"SELECT a.ime + ' ' + a.prezime AS ime_prezime, COUNT(b.knjiga_id) FROM AUTORI AS a JOIN autori_izdanja AS b ON a.autor_id = b.autor_id WHERE ime_prezime IN ({result}) GROUP BY a.ime";
da.SelectCommand = cmd1;
da.Fill(dt1);
try {
foreach (DataRow row in dt1.Rows)
{
chart1.Series[0].Points.AddXY(row[0], row[1]);
}
label2.Text = result;
button1.Enabled = false;
}
catch (Exception g) {
MessageBox.Show(g.Message);
}
}
conn.Close();
Может кто-нибудь решить это, пожалуйста...
Теперь он выдает другое исключение
в чем ошибка?
Это запрос $@"SELECT a.ime + ' ' + a.prezime AS ime_prezime, COUNT(b.knjiga_id) FROM AUTORI AS a JOIN autori_izdanja AS b ON a.autor_id = b.autor_id WHERE a.prezime IN ({sAutori}) GROUP BY a.ime"
, и теперь он выдает: > 'Неверный синтаксис рядом с 'adad'».
Нужны ли изменения в этой части? string result = ""; string sAutori; foreach (object itemChecked in checkedListBox1.CheckedItems) { DataRowView castedItem = itemChecked as DataRowView; string companyName = (string)castedItem["ime_prezime"]; //int? id = castedItem["autor_id"]; result += companyName + ", "; }
Могу ли я иметь ваши разногласия или что-то в этом роде? Мне очень нужно это, пожалуйста... Я учусь в старшей школе, и мне это нужно через 5 часов :D
Это какая-то ошибка в выводе, например, он неправильно разделен или что-то в этом роде.
Например, когда я выбираю первые два, sAutori получает значение Александр Пушкин, Эмили Бронте и говорит, что у него синтаксическая ошибка после Пушкина. Также выдает ошибку в строке da.Fill(dt1);
Ошибка для последнего ,
из цикла for, добавляющего строку результата. Вы можете удалить последний ,
, проверив if (result != string.Empty) {result.RemoveLast(",");}
после цикла foreach
Я сделал это так>: sAutori = result.Substring(0, result.Length - 1);
Я также изменил строку result += companyName + ",";
Вам не нужно сохранять это после в sAutori. просто используйте результат
Все еще та же ошибка, что и последняя, которую я упомянул 3 комментария выше. Могу ли я отправить вам полный код куда-нибудь?
result += "'"+companyName+"'" + ",";
Добавить '
Теперь это исключение без запроса на редактирование: > Столбец «AUTORI.prezime» недействителен в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.
Мне нужно показать писателей на графике, который я выбираю в checkedListBox
. Проблема в том, что они упорядочены ime_prezime
в checkedListBox
, поэтому я не могу просто использовать их идентификатор в этом случае.
Если у вас есть другая идея, как это сделать, я открыт для этого
В группе вместо a.ime
используйте b.knjiga_id
,ime_prezime
добавьте SELECT a.ime + ' ' + a.prezime AS ime_prezime, COUNT(b.knjiga_id) FROM AUTORI AS a JOIN autori_izdanja AS b ON a.autor_id = b.autor_id WHERE a.prezime IN ({sAutori}) GROUP BY ime_prezime
. См. редактирование одного
Теперь снова в da.Fill(dt 1) выдает исключение> Неверное имя столбца 'ime prezime'
SELECT a.ime + ' ' + a.prezime AS ime_prezime, COUNT(b.knjiga_id) FROM AUTORI AS a JOIN autori_izdanja AS b ON a.autor_id = b.autor_id WHERE a.prezime IN ({result}) GROUP BY a.ime , a.prezime
. См. редактирование одного
Теперь у него нет исключений, но он ничего не пишет на графике.
Если вы можете отлаживать, проверьте значения dataTable. Я думаю, этот пример поможет вам в дальнейшем stackoverflow.com/questions/11556935/…
Хорошо переменная result возвращает всех писателей, которые я выбираю, но не устанавливает никаких строк в таблице.
Есть ли в вашей таблице данные с этими выборками? Отладьте код, получите SQL-запрос и запустите SQL.
Также не могли бы вы принять мой ответ, который будет оценен. Поскольку ваша ошибка, которая отображалась в коде, была устранена.
Да могу конечно. Проблема в том, что он снова выдает исключение, когда вы пишете ime_prezime
после where
Я добавил a.ime + ' ' + a.prezime
в Где. Проверьте с помощью этого запроса. Это может дать вам некоторые данные.
conn.Open();
//chart1.Series.Clear();
//string predmeti = "";
string result = "";
string[] sAutori;
foreach (object itemChecked in checkedListBox1.CheckedItems)
{
DataRowView castedItem = itemChecked as DataRowView;
string companyName = (string)castedItem["ime_prezime"];
//int? id = castedItem["autor_id"];
result += "'"+companyName+"'" + ",";
}
if (checkedListBox1.CheckedItems.Count < 2)
{
MessageBox.Show("Morate izabrati bar dva pisca!");
}
else
{
if (result != string.Empty ){
result = result.Substring(0, result.Length - 1);
}
//string result = predmeti.Substring(0, predmeti.Length - 1);
cmd1.CommandText = $@"SELECT a.ime + ' ' + a.prezime AS ime_prezime, COUNT(b.knjiga_id) FROM AUTORI AS a JOIN autori_izdanja AS b ON a.autor_id = b.autor_id WHERE a.ime + ' ' + a.prezime IN ({result}) GROUP BY a.ime + ' ' + a.prezime";
da.SelectCommand = cmd1;
da.Fill(dt1);
try {
foreach (DataRow row in dt1.Rows)
{
chart1.Series[0].Points.AddXY(row[0], row[1]);
}
label2.Text = result;
button1.Enabled = false;
}
catch (Exception g) {
MessageBox.Show(g.Message);
}
}
Просто измените CommandText на $@"SELECT a.ime + ' ' + a.prezime AS ime_prezime, COUNT(b.knjiga_id) FROM AUTORI AS a JOIN autori_izdanja AS b ON a.autor_id = b.autor_id WHERE a.ime + ' ' + a.prezime IN ({result}) GROUP BY a.ime + ' ' + a.prezime"
, и он отлично работает.
SqlCommand cmd;
SqlCommand cmd1;
SqlDataAdapter da;
DataTable dt;
DataTable dt1;
void Connection()
{
conn = new SqlConnection();
conn.ConnectionString = @"Data Source=DESKTOP-QEDL8JA\SQLEXPRESS;Initial Catalog=EvidencijaKnjiga;Integrated Security=True;";
cmd = new SqlCommand();
cmd1 = new SqlCommand();
cmd.Connection = conn;
cmd1.Connection = conn;
dt = new DataTable();
dt1 = new DataTable();
da = new SqlDataAdapter();
}
void stats()
{
Connection();
//string select = "SELECT";
}
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
Connection();
cmd.CommandText = "SELECT autor_id, ime + ' ' + prezime AS ime_prezime FROM autori ORDER BY ime_prezime";
da.SelectCommand = cmd;
da.Fill(dt);
checkedListBox1.DataSource = dt;
checkedListBox1.DisplayMember = "ime_prezime";
checkedListBox1.ValueMember = "autor_id";
}
private void button3_Click(object sender, EventArgs e)
{
this.Close();
}
private void button2_Click(object sender, EventArgs e)
{
chart1.Series[0].Points.Clear();
button1.Enabled = true;
//chart1.Series.Clear();
//chart1.ChartAreas.Clear();
checkedListBox1.ClearSelected();
}
private void button1_Click(object sender, EventArgs e)
{
Connection();
conn.Open();
/*cmd.CommandText = "SELECT autor_id, ime + ' ' + prezime AS ime_prezime FROM autori ORDER BY ime_prezime";
da.SelectCommand = cmd;
da.Fill(dt);*/
//chart1.Series.Clear();
//string predmeti = "";
string result = "";
//string sAutori;
foreach (object itemChecked in checkedListBox1.CheckedItems)
{
DataRowView castedItem = itemChecked as DataRowView;
string companyName = (string)castedItem["ime_prezime"];
//int? id = castedItem["autor_id"];
result += "'" + companyName + "'" + ",";
}
if (checkedListBox1.CheckedItems.Count < 2)
{
MessageBox.Show("Morate izabrati bar dva pisca!");
}
else
{
if (result != string.Empty)
{
result = result.Substring(0, result.Length - 1);
}
//string result = predmeti.Substring(0, predmeti.Length - 1);
cmd1.CommandText = $@"SELECT a.ime + ' ' + a.prezime AS ime_prezime, COUNT(b.knjiga_id) FROM AUTORI AS a JOIN autori_izdanja AS b ON a.autor_id = b.autor_id WHERE a.ime + ' ' + a.prezime IN ({result}) GROUP BY a.ime + ' ' + a.prezime";
da.SelectCommand = cmd1;
da.Fill(dt1);
//dataGridView1.DataSource = dt1;
try
{
foreach (DataRow row in dt1.Rows)
{
chart1.Series[0].Points.AddXY(row[0], row[1]);
}
label2.Text = result;
button1.Enabled = false;
}
catch (Exception g)
{
MessageBox.Show(g.Message);
}
}
conn.Close();
}```
This is the final code. I just ujusted some things and it worked. Thank you so much on help :D
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, редактировать добавьте дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.
В вашем операторе выбора, в котором вам нужно заменить
ime_prezime
наa.prezime
, тогда все должно работать. В каком случае вам нужно использовать исходное имя столбца вместо псевдонима столбца.