2015-01-29 3 views
1

Некоторые пользователи приложения получают исключения при заполнении набора данных из файла DBF с помощью драйвера VisualFoxPro 9.0. Я не могу понять, что происходит, потому что ошибка всегда возникает для некоторых пользователей, никогда не бывает для других пользователей, а иногда (в зависимости от местоположения файла .DBF) происходит для других пользователей. Я гарантировал, что у всех пользователей установлен драйвер visual fox pro 9.0. Вот фрагмент кода, вызывающего проблему (leieLoc является расположение файла DBF):OleDb Exception: команда содержит непризнанную фразу/ключевое слово

string constr = "Provider=VFPOLEDB.1;Data Source=" + this.leieLoc + ";"; 
OleDbConnection con = new OleDbConnection(constr); 
string sql = "select * from " + this.leieLoc + ";"; 
OleDbCommand cmd = new OleDbCommand(sql, con); 
con.Open(); 
DataSet ds = new DataSet(); 
OleDbDataAdapter da = new OleDbDataAdapter(cmd); 
da.Fill(ds); 
da.Dispose(); 
ds.Dispose(); 
cmd.Dispose(); 
con.Dispose(); 
con.Close(); 

Я желаю, чтобы я мог изменить формат базы данных, однако я не могу, как она выйдет на треть вечеринка.

Ошибка трассировки стека выглядит следующим образом:

System.Data.OleDb.OleDbException (0x80040E14): Command contains unrecognized phrase/keyword. 
    at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) 
    at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) 
    at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) 
    at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) 
    at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) 
    at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior) 
    at System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) 
    at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 
    at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 
    at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet) 
    at ExclusionSearcher.Searching.ThreadProcesser.searchLeie(List`1 names) 

Любая помощь будет принята с благодарностью; Я понятия не имею, что может быть причиной этой проблемы.

+0

Источник данных и имя таблицы не могут быть одинаковыми. –

+0

Проверьте мой ответ и скажите мне, помогли ли вы! – mybirthname

ответ

3

У вас есть проблемы с

string sql = "select * from " + this.leieLoc + ";"; 
string constr = "Provider=VFPOLEDB.1;Data Source=" + this.leieLoc + ";"; 

Первого столом, и DataSource не может быть same.If ошибка Command contains unrecognized phrase/keyword Я полагаю, что строка соединения является правильной. Это означает, что вы должны исправить свой tableName в строке sql.

Также нет необходимости звонить Close и Dispose по соединению. Достаточно только Close! Нет необходимости в Dispose DataSet. Также вы можете использовать вместо Dispose, потому что в вашем коде, если исключение произойдет, ресурсы будут не Dispose. Если вы хотите использовать непосредственно Dispose, вы должны написать это:

try 
{ 
    conn.Open() 
} 
catch(Exception) 
{ 
    throw; 
} 
finnaly 
{ 
    conn.Close(); 
} 

В этом случае вы гарантировать, что соединение будет закрыто. Это также должно быть сделано для адаптера.

+0

Используйте ключевое слово «Использование», где это необходимо. –

0

Постарайтесь вложить this.leieLoc переменную в двойные кавычки в ваш SELECT.

Смежные вопросы