sai.2012 Ответов: 3

Как автоматизировать csv-файл для доступа к БД с помощью спецификации импорта в C#


Привет,

Я новичок в этом деле .Сетевые технологии.

у меня есть задача, то есть получить данные из oracle в виде datatable,проверить нулевые значения, заменить одинарную кавычку на двойную кавычку в Столбцах datatable и вставить в базу данных access.

я написал код, но его загрузка занимает 3 часа.

а также недавно после вставки нескольких записей я получил ошибку "операция должна использовать обновляемый запрос", но я использую insert query, я не написал никакого запроса обновления.

Теперь мой менеджер попросил меня автоматизировать csv-файл для доступа к БД с помощью спецификации импорта в c#.

Бек импорт спецификации автоматически обрабатывает нулевых и единичных значений котировки.

Как это сделать , дайте мне идею.

Заранее спасибо.

Что я уже пробовал:

Мой предыдущий код таков :но требуется много времени, чтобы вставить его в базу данных access.

for (int i = 0; i < dtAEDetails.Rows.Count; i++)
{
	for (int j = 0; j < dtAEDetails.Columns.Count; j++)
	{
		sOffice = "'" + dtAEDetails.Rows[i][0].ToString() + "'";
		sInsertValues = sOffice + ",";
		sAe = "'" + dtAEDetails.Rows[i][1].ToString() + "'";
		sInsertValues = sInsertValues + sAe + ",";
		sDesc1 = "'" + dtAEDetails.Rows[i][7].ToString().Replace ("'", "''") + "'";//replacing single quote into double quote
		sInsertValues = sInsertValues + sDesc1 + ",";
		if (!string.IsNullOrEmpty(dtAEDetails.Rows[i][9].ToString()))
		{
			sPrinc = "'" + dtAEDetails.Rows[i][9].ToString().Replace("'", "''") + "'";
			sInsertValues = sInsertValues + sPrinc + ",";
		}
		else
		{
			sInsertValues = sInsertValues + "null" + ",";//checking null value
		}
		insertAEdetails.ParmValue = sInsertValues;
		insertAEdetails.InsertIntoAccess();//inserting into access db this concatenated string.
	}
}

public void InsertIntoAccess()
{
	string sQueryToRun = string.Empty;
	//set the database connection
	OleDbConnection oleDbConn = new OleDbConnection(strAccessConn);

	try
	{
		//prep sqlManager
		SqlManager sqlManager = SqlManagerUtil.GetSqlManager(sSqlXmlFile);

		//Get the query from sql manager
		SqlExecution execution = sqlManager.GetSqlExecution(sQueryName.ToString());
		sQueryToRun = execution.SqlText;
		sQueryToRun = sQueryToRun.Replace(":ValueString", sParmValue.ToString());

		//prep the command
		OleDbCommand InsCmd = new OleDbCommand(sQueryToRun.ToString(), oleDbConn);
		oleDbConn.Open();  //open the connection
		InsCmd.ExecuteNonQuery();  //execute the query
	}
	catch (Exception ex)
	{
		Logger.WriteMessage(" Error in InsertIntoAccess");
		Logger.WriteMessage("        " + ex.Message);
		throw ex;
	}
	finally
	{
		// if connection is open close it
		if (oleDbConn.State == ConnectionState.Open)
		{
			oleDbConn.Close();
		}
	}
}

3 Ответов

Рейтинг:
22

RickZeeland

Я нашел этот фрагмент кода на MSDN: C# Select .CSV файл, считанный в базу данных MS Access[^]

System.Data.OleDb.OleDbConnection AccessConnection = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Test Files\\db1 XP.mdb");

AccessConnection.Open();

System.Data.OleDb.OleDbCommand AccessCommand = new System.Data.OleDb.OleDbCommand("SELECT * INTO [ImportTable] FROM [Text;FMT=Delimited;DATABASE=C:\\Documents and Settings\\...\\My Documents\\My Database\\Text;HDR=No].[x123456.csv]", AccessConnection);

AccessCommand.ExecuteNonQuery();
AccessConnection.Close();


Maciej Los

5ed! Использование OleDb с csv-файлом-очень хорошая идея!

RickZeeland

Энтузиазм, как всегда, спасибо !
Но если бы родные драйверы были доступны, это было бы еще быстрее, я думаю, OLE-это не самый быстрый способ. Однако, поскольку я больше не использую доступ, я не знаю, существует ли собственный драйвер ...

Рейтинг:
2

Maciej Los

Проверьте мой старый ответ об импорте данных из csv с определенным разделителем и т. д.: Чтение Столбцов Специфичных Для Текстового Файла[^]
Это может быть полезно при поиске соответствующих статей на MSDN: Как читать данные текстового файла и отображать их в datagridview с помощью VB.NET[^]


Рейтинг:
1

sai.2012

Привет Рик,

Спасибо за ваш ответ . функция executenonquery() выбрасывает исключение .

Несоответствие типов данных в выражении критериев.

Bec мой csv-файл содержит текст в одинарных кавычках и нулевые значения. Не могли бы вы дать мне какую-нибудь идею , раньше я использовал для проверки кода, поэтому это заняло много времени, любую технику оптимизации.,


private string strAccessConn1 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + WebConfig.GetSetting("AccessDBFilePath.devdesktop");//NEED TO CHANGE BEFORE DEPLOYMENT

      public DataTable InserttblDetailOPSData(string sInputPath, string sInFile)
      {
          string query = string.Empty;
          string header = "Yes";
          DataTable dataTable = null;
          string filePath = string.Empty;
          string fileName = string.Empty;
          sInputPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + @"\";
          sInFile = WebConfig.GetSetting("InFileName");

          try
          {

              //csv file directory
              filePath = sInputPath;
              //csv file name
              fileName = WebConfig.GetSetting("InFileName");

              query = @"SELECT * FROM [" + fileName + "]";

              using (OleDbConnection connection = new OleDbConnection((@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Text;HDR=" + header + "\"")))
              {
                  using (OleDbCommand command = new OleDbCommand(query, connection))
                  {
                      using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
                      {
                          dataTable = new DataTable();
                          dataTable.Locale = CultureInfo.CurrentCulture;
                          adapter.Fill(dataTable);

                          try
                          {
                              //create connection to Access DB
                              OleDbConnection DBconn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + WebConfig.GetSetting("AccessDBFilePath.devdesktop"));
                              OleDbCommand cmd = new OleDbCommand();
                              //set cmd settings
                              cmd.Connection = DBconn;
                              cmd.CommandType = CommandType.Text;
                              //open DB connection
                              DBconn.Open();
                              //read each row in the Datatable and insert that record into the DB
                              for (int i = 0; i < dataTable.Rows.Count; i++)
                              {
                                  cmd.CommandText = "INSERT INTO tblDetail ([OFFICE],[AE],[SETDATE],[ACCT],[SHORT],[BS],[SHARES],[DESC],[PRICE],[PRINC],[GROSS],[STAND],[NET],[NEWNET],[AECHG],[BONUS],[BT],[CANCEL],[TRANSCODE],[ORDER],[REALGR],[ANNUITYNET],[RECORDID],[USERCODE1],[USERCODE7])" +
                                                   " VALUES ('" + dataTable.Rows[i].ItemArray.GetValue(0) + "','" + dataTable.Rows[i].ItemArray.GetValue(1) + "','" + dataTable.Rows[i].ItemArray.GetValue(2) +
                                                   "','" + dataTable.Rows[i].ItemArray.GetValue(3) + "','" + dataTable.Rows[i].ItemArray.GetValue(4) + "','" + dataTable.Rows[i].ItemArray.GetValue(5) +
                                                   "','" + dataTable.Rows[i].ItemArray.GetValue(6) + "','" + dataTable.Rows[i].ItemArray.GetValue(7) + "','" + dataTable.Rows[i].ItemArray.GetValue(8) +
                                                   "','" + dataTable.Rows[i].ItemArray.GetValue(9) + "','" + dataTable.Rows[i].ItemArray.GetValue(10) + "','" + dataTable.Rows[i].ItemArray.GetValue(11) +
                                                   "','" + dataTable.Rows[i].ItemArray.GetValue(12) + "','" + dataTable.Rows[i].ItemArray.GetValue(13) + "','" + dataTable.Rows[i].ItemArray.GetValue(14) +
                                                   "','" + dataTable.Rows[i].ItemArray.GetValue(15) + "','" + dataTable.Rows[i].ItemArray.GetValue(16) + "','" + dataTable.Rows[i].ItemArray.GetValue(17) +
                                                   "','" + dataTable.Rows[i].ItemArray.GetValue(18) + "','" + dataTable.Rows[i].ItemArray.GetValue(19) + "','" + dataTable.Rows[i].ItemArray.GetValue(20) +
                                                   "','" + dataTable.Rows[i].ItemArray.GetValue(21) + "','" + dataTable.Rows[i].ItemArray.GetValue(23) + "','" + dataTable.Rows[i].ItemArray.GetValue(24) +
                                                   "','" + dataTable.Rows[i].ItemArray.GetValue(25) + "')";

                                  cmd.ExecuteNonQuery();
                              }
                              //close DB.connection
                              DBconn.Close();
                          }
                          catch (Exception ex)
                          {
                              //sendEmail(ConfigurationManager.AppSettings["QuantumEmailFrom"], ConfigurationManager.AppSettings["QuantumEmailTo"], "Quantum CSV Import To SMS Database FAILED", ex.Message);
                          }
                      }
                  }
              }
              //checks folder exists
              if (Directory.Exists(sInputPath))
              {
                  //deletes all folder contents and recreates an empty folder
                  Directory.Delete(sInputPath, true);
                  Directory.CreateDirectory(sInputPath);
              }
          }
          catch (Exception ex)
          {
              throw ex;
              //sendEmail(ConfigurationManager.AppSettings["QuantumEmailFrom"], ConfigurationManager.AppSettings["QuantumEmailTo"], "Quantum CSV Import To SMS Database FAILED", ex.Message);
          }

          return dataTable;
      }


RickZeeland

Я думаю, что было бы проще и быстрее сначала загрузить CSV-файл в виде текста, например, с помощью файла.ReadAllText(), затем замените все одинарные кавычки и нулевые значения, сохраните его и затем используйте запрос, упомянутый в решении 1, чтобы импортировать его в базу данных Access.
Удачи вам !

Maciej Los

Такой контент должен быть размещен в виде комментария. Это вообще не решение!