2016-05-24 4 views
1

Попытка открыть обычные файлы csv с oledb, чтобы мы могли выполнять запросы на них (DISTINCT, UPDATE, SELECT и т. Д.). , Кажется, я не могу правильно установить строку подключения.C# .NET 4.6.1 Ошибка OleDbConnection: Формат строки инициализации не соответствует спецификации, начинающейся с индекса 152

FYI: «Регистратор» - это собственный служебный класс, который записывает на вывод отладки VS и отдельный файл .log для родительского класса.

сопп является частным OleDbConnection в классе

OleDbConnection connectToFile() 
{ 
    string method = this.ToString() + ".connectToFile"; 
    Logger.Debug("starting", method); 
    Logger.Debug("strFolderPath = " + strFolderPath, method); 
    string ACCESS_CONN = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFolderPath.Substring(0,strFolderPath.Length) + ";Extended Properties = \"text; HDR=Yes; FMT=Delimited(,)\";"); 
    Logger.Debug("ACCESS_CONN = " + ACCESS_CONN, method); 
    using (conn = new OleDbConnection()) 
    { 
     try 
     { 
      conn.ConnectionString = ACCESS_CONN; 
      Logger.Debug("connection string: " + conn.ConnectionString, method); 
      conn.Open(); 
      if ("" != conn.ConnectionString) 
       Logger.Debug("Conn is open", method); 
      else 
       Logger.Debug("Conn didn't open", method); 
      return conn; 
     } 
     catch (Exception Ex) 
     { 
      Logger.Error(Ex, method); 
      return null; 
     } 
    } 

} 

Logger показывает переменная ACCESS_CONN является:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\server\share\DEV\folder1\folder2\folder3\Extended Properties = "text; HDR=Yes; FMT=Delimited";

Тогда в общедоступный метод:

try 
{ 
    conn = connectToFile(); //this is the call to the method above 
    Logger.Debug("Connected to File", method); 
    adapter = new OleDbDataAdapter(commandString, conn); 
    dt = new DataTable(strShortFileName); 
    if (dt != null) 
     Logger.Debug("dataAdapter in place", method); 
    else 
     Logger.Debug("dataAdapter IS NOT in place", method); 
    adapter.Fill(dt); 
} 
catch (Exception Ex) 
{ 
    Logger.Error("Connection failed to open, exception: " + Ex.ToString(), method); 
    return null; 
} 

Выход отладки имеет следующим, основной проблемой является:

System.InvalidOperationException: The ConnectionString property has not been initialized.

Я предполагаю, что в строке соединения есть проблема синтаксиса, но я не могу найти хороший ресурс для его настройки в моем конкретном случае (oledb, delimiter = ',' не используя схему .init файл и т.д.)

2016-05-24 13:09:46,INFO,FileParser: adaptive.common.AdaptiveFileParser,Starting 
2016-05-24 13:09:46,DEBUG,adaptive.common.AdaptiveFileParser.connectToFile,starting 
2016-05-24 13:09:46,DEBUG,adaptive.common.AdaptiveFileParser.connectToFile,strFolderPath = \\server\share\DEV\folder1\folder2\folder3\ 
2016-05-24 13:09:46,DEBUG,adaptive.common.AdaptiveFileParser.connectToFile,ACCESS_CONN = Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\server\share\DEV\folder1\folder2\folder3\;Extended Properties = "text; HDR=Yes; FMT=Delimited(,)"; 
2016-05-24 13:09:46,DEBUG,adaptive.common.AdaptiveFileParser.connectToFile,connection string: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\server\share\DEV\folder1\folder2\folder3\;Extended Properties = "text; HDR=Yes; FMT=Delimited(,)"; 
'CommonTestExe.vshost.exe' (CLR v4.0.30319: CommonTestExe.vshost.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.Transactions\v4.0_4.0.0.0__b77a5c561934e089\System.Transactions.dll'. Symbols loaded. 
'CommonTestExe.vshost.exe' (CLR v4.0.30319: CommonTestExe.vshost.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll'. Symbols loaded. 
'CommonTestExe.vshost.exe' (CLR v4.0.30319: CommonTestExe.vshost.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.Wrapper.dll'. Symbols loaded. 
2016-05-24 13:09:46,DEBUG,adaptive.common.AdaptiveFileParser.connectToFile,Conn is open 
2016-05-24 13:09:46,DEBUG,FileParser: adaptive.common.AdaptiveFileParser,Connected to File 
2016-05-24 13:09:46,DEBUG,FileParser: adaptive.common.AdaptiveFileParser,dataAdapter in place 
Exception thrown: 'System.InvalidOperationException' in System.Data.dll 
Exception thrown: 'System.InvalidOperationException' in System.Data.dll 
2016-05-24 13:09:46,ERROR,FileParser: adaptive.common.AdaptiveFileParser,Connection failed to open, exception: System.InvalidOperationException: The ConnectionString property has not been initialized. 
    at System.Data.OleDb.OleDbConnection.PermissionDemand() 
    at System.Data.OleDb.OleDbConnectionFactory.PermissionDemand(DbConnection outerConnection) 
    at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) 
    at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) 
    at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
    at System.Data.OleDb.OleDbConnection.Open() 
    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(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior) 
    at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) 
    at adaptive.common.AdaptiveFileParser.getQueryResults(String commandString) in C:\Users\kmckinley\Source\Repos\labautocommoncode\adaptive.common\adaptive.common\fileParser.cs:line 89 
adaptive.common.adCommonLib, ending 

EDIT:

изменил connStr использовать OleDbConectionStringBuilder за советом SLaks:

OleDbConnectionStringBuilder connStrBuilder = new OleDbConnectionStringBuilder(); 
connStrBuilder.Add("Provider", "Microsoft.Jet.OLEDB.4.0"); 
connStrBuilder.DataSource = strFolderPath.Substring(0, strFolderPath.Length); 
connStrBuilder.Add("Extended Properties", @"text; HDR=Yes; FMT=Delimited(,)"); 
conn.ConnectionString = connStrBuilder.ToString(); 
Logger.Debug("connection string: " + conn.ConnectionString, method); 
conn.Open(); 

теперь консоли показывает соединение открыто, но до сих пор говорит connstr не инициализирован:

2016-05-24 13:46:32,DEBUG,adaptive.common.AdaptiveFileParser.connectToFile,connection string: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\server\share\DEV\folder1\folder2\folder3\;Extended Properties="text; HDR=Yes; FMT=Delimited(,)" 'CommonTestExe.vshost.exe' (CLR v4.0.30319: 
'CommonTestExe.vshost.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll'. Symbols loaded. 
'CommonTestExe.vshost.exe' (CLR v4.0.30319: CommonTestExe.vshost.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.Wrapper.dll'. Symbols loaded. 2016-05-24 13:46:32,DEBUG,adaptive.common.AdaptiveFileParser.connectToFile,Conn is open with Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\server\share\DEV\folder1\folder2\folder3\;Extended Properties="text; HDR=Yes; FMT=Delimited(,)", state is: Open 
2016-05-24 13:46:32,DEBUG,FileParser: adaptive.common.AdaptiveFileParser,Connected to File 
2016-05-24 13:46:32,DEBUG,FileParser: adaptive.common.AdaptiveFileParser,dataAdapter in place Exception thrown: 'System.InvalidOperationException' in System.Data.dll Exception thrown: 'System.InvalidOperationException' in System.Data.dll 
2016-05-24 13:46:33,ERROR,FileParser: adaptive.common.AdaptiveFileParser,Connection failed to open, exception: System.InvalidOperationException: The ConnectionString property has not been initialized. 
    at System.Data.OleDb.OleDbConnection.PermissionDemand() 
    at System.Data.OleDb.OleDbConnectionFactory.PermissionDemand(DbConnection outerConnection) 
    at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) 
    at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) 
    at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
    at System.Data.OleDb.OleDbConnection.Open() 
    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(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) 
    at adaptive.common.AdaptiveFileParser.getQueryResults(String commandString) in C:\Users\kmckinley\Source\Repos\labautocommoncode\adaptive.common\adaptive.common\fileParser.cs:line 89 
+0

Используйте 'OleDbConnectionStringBuilder'. – SLaks

+0

добавил еще один отладочный файл: if (""! = Conn.ConnectionString) Logger.Debug ("Conn открыт с" + conn.ConnectionString + ", состояние:" + conn.State, method) ;, которое показывает это открыто – Keith

+0

@SLaks, у меня проблемы с поиском гидов в Интернете, как это использовать. Я достаточно легко вижу ([link] (https://msdn.microsoft.com/en-us/library/system.data.oledb.oledbconnectionstringbuilder (v = vs.90) .aspx), как построить connStr, но как этот поток подается в объект conn? – Keith

ответ

0

Оказывается, я был дважды обзорного переменную «Conn»:

плохой код:

OleDbConnection connectToFile() 
{ 
    string method = this.ToString() + ".connectToFile"; 
    Logger.Debug("starting", method); 
    Logger.Debug("strFolderPath = " + strFolderPath, method); 
    string ACCESS_CONN = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFolderPath.Substring(0,strFolderPath.Length) + ";Extended Properties = \"text; HDR=Yes; FMT=Delimited(,)\";"); 
    Logger.Debug("ACCESS_CONN = " + ACCESS_CONN, method); 
    using (conn = new OleDbConnection()) 
    { 
     try 
     { 
      conn.ConnectionString = ACCESS_CONN; 
      Logger.Debug("connection string: " + conn.ConnectionString, method); 
      conn.Open(); 
      if ("" != conn.ConnectionString) 
       Logger.Debug("Conn is open", method); 
      else 
       Logger.Debug("Conn didn't open", method); 
      return conn; 
     } 
     catch (Exception Ex) 
     { 
      Logger.Error(Ex, method); 
      return null; 
     } 
    } 

} 

скорректированный код:

conn = new OleDbConnection(); 
try 
{ 
    OleDbConnectionStringBuilder connStrBuilder = new OleDbConnectionStringBuilder(); 
    connStrBuilder.Provider = "Microsoft.Jet.OLEDB.4.0"; 
    connStrBuilder.DataSource = strFolderPath; 
    connStrBuilder.Add("Extended Properties", @"text; HDR=Yes; FMT=Delimited(" + delim + ")"); 
    conn.ConnectionString = connStrBuilder.ToString(); 
    Logger.Debug("connection string: " + conn.ConnectionString, method); 
    conn.Open(); 
    if ("" != conn.ConnectionString) 
     Logger.Debug("Conn is open with " + conn.ConnectionString + ", state is: " + conn.State, method); 
    else 
    Logger.Debug("Conn didn't open", method); 
    return conn; 
} 
catch (Exception Ex) 
{ 
    Logger.Error(Ex, method); 
    return null; 
} 
Смежные вопросы

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