C# 如果列名和顺序不同,如何从csv插入数据以访问数据库
它是用c语言编程的。 我正在选择csv文件并将其插入access db。我说,csv文件中有6列,如ID、FName、LName、Address、Zipcode、cell number,顺序相同。在access中,我的列是按相同顺序排列的FirstName、LastName、S_NO、zip_code。如何导入此csv文件以访问数据库,如果列名不同,顺序也不同。我如何实现这个??请建议。 我尝试了以下代码:C# 如果列名和顺序不同,如何从csv插入数据以访问数据库,c#,sql,visual-studio,ms-access,csv,C#,Sql,Visual Studio,Ms Access,Csv,它是用c语言编程的。 我正在选择csv文件并将其插入access db。我说,csv文件中有6列,如ID、FName、LName、Address、Zipcode、cell number,顺序相同。在access中,我的列是按相同顺序排列的FirstName、LastName、S_NO、zip_code。如何导入此csv文件以访问数据库,如果列名不同,顺序也不同。我如何实现这个??请建议。 我尝试了以下代码: enter code here 数据集da=新数据集; 尝试 {
enter code here
数据集da=新数据集;
尝试
{
da = this.ConnectCSV(strCSVFile);
string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\EmpApp\\EmpData.accdb;";
OleDbConnection conn = new OleDbConnection(connstring);
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = CommandType.Text;
conn.Open();
for (int i = 0; i <= da.Tables["Ss"].Rows.Count - 1; i++)
{
for (int j = 1; j <= da.Tables["Ss"].Columns.Count - 1; j++)
{
cmd.CommandText = "Insert into EMP_DOWNLOAD ( ID,Company_name,month_billed,year,start_date,end_date,Designation"
+ ") values(" + (i + 1) + ",'"
+ da.Tables["Ss"].Rows[i].ItemArray.GetValue(0) + "',"
+ da.Tables["Ss"].Rows[i].ItemArray.GetValue(8) +
da.Tables["Ss"].Rows[i].ItemArray.GetValue(9) + ")";
cmd.Connection = conn;
cmd.ExecuteNonQuery();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
btnUpload.Enabled = false;
}
enter code here
您可以为不需要的字段传递null。使用MS Access,您可以直接从CSV运行到表格:
INSERT INTO EMP_DOWNLOAD (ID, Forename, LastName, Address, Zip_Code )
SELECT ID, FName, LName, Address, Zipcode
FROM [Text;Database=z:\docs\;HDR=yes].[importfilename.csv]
我将使用Linq语句将文本分开,并创建参数对象数组,然后在数组中循环,将参数添加到发送到数据库的每个insert语句中 像这样
var csvParams = (from line in System.IO.File.ReadLines("fileName.csv")
from cell in line.Split(',').AsEnumerable()
select new[]
{
new OleDbParameter("@fn", cell[1]),
new OleDbParameter("@ln", cell[2]),
new OleDbParameter("@sn", cell[3]),
new OleDbParameter("@zc", cell[4])
});
using( OleDbConnection conn = new OleDbConnection("CONNECTION STRING GOES HERE"))
{
foreach (var person in csvParams)
{
using (OleDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "INSERT INTO People(FirstName, LastName, S_NO, zip_code) VALUES (@fn, @ln, @sn, @zc)";
cmd.Parameters.AddRange( (OleDbParameter[]) person);
cmd.ExecuteNonQuery();
}
}
}
您好,nikky,您在这里遇到了这个问题。最好在代码问题中包含一些代码。谢谢Remou。添加了我试图导入到access的代码。是的。但是在csv文件中,我的列名和顺序与access文件列名和顺序不同。这就是问题所在。不是。只需在如上所示,插入和选择的顺序相同。它们在表或csv中的顺序无关紧要。但csv和access文件的主键应相同?您正在尝试运行更新而不是追加,对吗?如果您有自动编号ID并希望追加,请不要将ID作为字段包含在任意一侧。But,我的值不是静态的。这些值来自.csv文件,列名称和顺序与access文件不同。让我看看我是否理解您的意思。您的意思是csv中的顺序或列名可以从csv更改为csv,还是csv中的列顺序与access数据库不同,但通过al一致l csv的。如果是后者,那么我的解决方案应该有效。您只需确保存储在OLEDBPParameter中的值具有与查询中的值相对应的短名称ex:@fn。传递到AddRange方法中的OLEDBPParameters的顺序无关紧要。如果是前者,则需要更多的思考和研究我有一个查找表。让我澄清一下。我在csv文件中有firstname、Lastname、empid作为列,在access中有fname、lname、e_id作为列。现在,我想在access中插入csv文件数据。但是,列名是不同的。我该怎么做?只要列顺序不从csv更改为csv,我的解决方案就可以工作了。你所需要的是d要做的是将传递到OLEDB参数的数组位置与传递到查询中的短名称相关联。数组位置对应于csv文件中的列。