Помогите с запросом.
От: Bitz  
Дата: 16.09.05 00:37
Оценка:
Здрасьте.
Проблема такая: есть две связные таблицы Clients и Оrders. Связь один ко многим, по полям Clients.ID и Orders.ID_Client.
Нужно получить все записи из Clients, которым удовлетворяют Orders где значение поля Orders.Date_Order = текущей дате.
База акцессовская, а всю жизнь делал все на MySQL, да и в C# недавно,

Пытаюсь сделать так:

string StrConn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=Aluminium.mdb;";            
string SQL="SELECT ID, Name, Phone, Address, Email, Type, Data_Order, ID_Client "+
           "FROM Clients " +
           "JOIN Orders " +
           "ON Clients.ID=Orders.ID_Client " +
           "WHERE Date_Order=" + System.DateTime.Now.ToShortDateString();

conn.Open();

OleDbConnection conn=new OleDbConnection(StrConn);
OleDbCommand cmdText=new OleDbCommand(SQL,conn);    
OleDbDataAdapter l_Adapter=new OleDbDataAdapter(cmdText);

DataSet l_DataSet=new DataSet();
l_Adapter.Fill(l_DataSet);
GridMain.DataSource=l_DataSet;

Пишет такую лажу: An unhandled exception... и т.д.
Понимаю что какую-то хрень не так сделал, но не знаю какую
Re: Помогите с запросом.
От: fefelov Россия  
Дата: 16.09.05 01:48
Оценка:
Здравствуйте, Bitz, Вы писали:

B>conn.Open();

B>OleDbConnection conn=new OleDbConnection(StrConn);


Это вызывает подозрение. Сначала вы открываете соединение (переменная conn у вас глобальная?), а потом — создаете новое, которое уже не открываете.

B>Пишет такую лажу: An unhandled exception... и т.д.


Расшифруйте свое и т.д.
Re[2]: Помогите с запросом.
От: Аноним  
Дата: 16.09.05 10:00
Оценка:
Насчет conn.Open()
Это я просто ошибся когда копировал, на самом деле все так:

string StrConn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=Aluminium.mdb;";            
string SQL="SELECT Clients.ID, Clients.Name, Clients.Phone, Clients.Address, Clients.Email, Clients.Type "+
        "FROM Clients " +
        "JOIN Orders " +
        "ON Clients.ID=Orders.ID_Client " +
        "WHERE Date_Order=" + System.DateTime.Now.ToShortDateString();
OleDbConnection conn=new OleDbConnection(StrConn);
OleDbCommand cmdText=new OleDbCommand(SQL,conn);    
OleDbDataAdapter l_Adapter=new OleDbDataAdapter(cmdText);
conn.Open();
DataSet l_DataSet=new DataSet();
l_DataSet.Tables.Add("ClientsOrders");
l_Adapter.Fill(l_DataSet);

GridMain.DataSource=l_DataSet;


Ошибку пишет такую An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in system.data.dll.
Что еще могу сказать?
Для простого запроса SELECT * FROM Clients этот код работает, так что, как мне кажется проблема в запросе.
Пробовал писать по всякому.
ID, Name, Phone, Address, Email, Type — это поля таблицы Clients
ID_Clients, Date_Order — это поля таблицы Orders (которые используются).
Re[3]: Помогите с запросом.
От: GlebZ Россия  
Дата: 16.09.05 10:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>        "WHERE Date_Order=" + System.DateTime.Now.ToShortDateString();
А>

Передавай дату через параметр.

С уважением, Gleb.
Re[4]: Помогите с запросом.
От: Bitz  
Дата: 16.09.05 11:06
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Передавай дату через параметр.

Дело точно не в этом, потому что даже просто без даты (Без WHERE) не работает.
Если нетрудно, подскажите ссылку где можно откопать SQL c синтаксисом для C# (или ADO.NET), а то для разных баз и языков они все-таки отличаются.
Re[3]: Помогите с запросом.
От: Митяй Россия http://dkomanov.livejournal.com
Дата: 16.09.05 11:15
Оценка:
А>Ошибку пишет такую An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in system.data.dll.
А>Что еще могу сказать?

засунь этот код в:

try
{
    // твой код
}
catch (Exception e)
{
    Console.WriteLine(e);
}


И напиши, что тебе в консоли выдалось на это.
Re[5]: Помогите с запросом.
От: GlebZ Россия  
Дата: 16.09.05 11:21
Оценка:
Здравствуйте, Bitz, Вы писали:

B>Дело точно не в этом, потому что даже просто без даты (Без WHERE) не работает.

B>Если нетрудно, подскажите ссылку где можно откопать SQL c синтаксисом для C# (или ADO.NET), а то для разных баз и языков они все-таки отличаются.
Нет "SQL c синтаксисом для C# (или ADO.NET)". Используемый SQL зависит от провайдера. А провайдер зависит от БД. Обычно провайдер поддерживает синтаксис своей базы данных.
1. Посмотри кто умирает
что-нибудь типа:
try
{
string StrConn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=Aluminium.mdb;";            
string SQL="SELECT ID, Name, Phone, Address, Email, Type, Data_Order, ID_Client "+
           "FROM Clients " +
           "JOIN Orders " +
           "ON Clients.ID=Orders.ID_Client " +
           "WHERE Date_Order=" + System.DateTime.Now.ToShortDateString();

conn.Open();

OleDbConnection conn=new OleDbConnection(StrConn);
conn.Open();
OleDbCommand cmdText=new OleDbCommand(SQL,conn);    
OleDbDataReader reader=cmdText.Execute())
try
{
reader.Read();
}
finally
{
reader.Close();
conn.Close();
}
}
catch(Exception e)
{
MessageBox.Show(e.message);
rethrow;
}

Может это совсем и не запрос виноват.

С уважением, Gleb.
PS:написал сходу, могут быть синтаксические ошибки
Re: Помогите с запросом.
От: Козьма Прутков Россия  
Дата: 16.09.05 11:33
Оценка:
B>
B>string SQL="SELECT ID, Name, Phone, Address, Email, Type, Data_Order, ID_Client "+
B>           "FROM Clients " +
B>           "JOIN Orders " +
B>           "ON Clients.ID=Orders.ID_Client " +
B>           "WHERE Date_Order=" + System.DateTime.Now.ToShortDateString();
B>

Дело похоже действительно в запросе. По-моему, нужно написать явно "INNER JOIN", а просто JOIN не прокатывает: есть там какие-то глупости в JetSQL. А вообще, открой базу в акцессе и вополни на ней свой запрос: там тебе куда информативнее инструмент объяснит, что не так
Да хранит вас господь в сухом прохладном месте...
Re[2]: Помогите с запросом.
От: GlebZ Россия  
Дата: 16.09.05 11:44
Оценка:
Здравствуйте, Козьма Прутков, Вы писали:

B>>
B>>string SQL="SELECT ID, Name, Phone, Address, Email, Type, Data_Order, ID_Client "+
B>>           "FROM Clients " +
B>>           "JOIN Orders " +
B>>           "ON Clients.ID=Orders.ID_Client " +
B>>           "WHERE Date_Order=" + System.DateTime.Now.ToShortDateString();
B>>

КП>Дело похоже действительно в запросе. По-моему, нужно написать явно "INNER JOIN", а просто JOIN не прокатывает: есть там какие-то глупости в JetSQL. А вообще, открой базу в акцессе и вополни на ней свой запрос: там тебе куда информативнее инструмент объяснит, что не так
Тогда уж:
SELECT ID, Name, Phone, Address, Email, Type, Data_Order, ID_Client 
from Clients, Orders where Clients.ID=Orders.ID_Client and Date_Order=?

Такое каждая база должна понять.

С уважением, Gleb.
Re[2]: Помогите с запросом.
От: Bitz  
Дата: 16.09.05 12:15
Оценка:
Здравствуйте, Козьма Прутков, Вы писали:

КП>Дело похоже действительно в запросе. По-моему, нужно написать явно "INNER JOIN", а просто JOIN не прокатывает: есть там какие-то глупости в JetSQL. А вообще, открой базу в акцессе и вополни на ней свой запрос: там тебе куда информативнее инструмент объяснит, что не так


Ты прав, дел действительно в запросе, надо колбасить так:

SELECT Clients.ID, Clients.Name, Clients.Phone, Clients.Address, Clients.Email, Clients.Type, Orders.ID_Client, Orders.Date_Order
FROM Clients INNER JOIN Orders ON Clients.ID = Orders.ID_Client
WHERE (((Orders.Date_Order)=Date()));

Спасибо всем, буду знать.
Вообщем оказывается вначале надо запросы конструировать прямо в акцессе, а потом уже их вставлять.
Re[3]: Помогите с запросом.
От: Козьма Прутков Россия  
Дата: 16.09.05 12:32
Оценка:
B>WHERE (((Orders.Date_Order)=Date()));
ну, такое количество скобок конечно перебор, даже для акцесса
B>Вообщем оказывается вначале надо запросы конструировать прямо в акцессе, а потом уже их вставлять.
да, жизнь учит, порой жестоко. И даже учитывая все убожество редактора запросов, его использовать удобнее нежели гадать, что там за ошибка, при использовании из клиентского приложения.
Да хранит вас господь в сухом прохладном месте...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.