Code Bye

csv文件导入使插入到数据库中的数据与表中的字段顺序对应

我把csv文件中的数据已经读入到datatable中,现在要插入到数据库里,但是数据库里的表中字段顺序和读到datatable中的csv文件字段顺序不一致,我要怎么写sql语句才能使插入到数据库中的数据与表中的字段顺序对应上呢。

 

5分
写个insert自己排顺序,根据字段名insert
引用 1 楼 bdmh 的回复:

写个insert自己排顺序,根据字段名insert

我有一个问题,就是我csv里的字段不固定,有时会增加,所以导入表时需要增加这个字段。所以我想问,写insert语句按字段名排顺序可以吗,应该怎么写呢?

如何读取csv文件到内存
用什么结构保存这个数据
如何将内存中的数据insert到数据库
你先研究明白这3个步骤具体如何,再纠结如何结合起来
你文件中的列数量不定,数据库的列数量固定,这完全是你没研究明白业务逻辑导致的
你先抛开代码不要死抠细节,如果就是随便给你个excel文档,让你把数据手动录入到数据库里去,你该怎么办,这个问题想明白了再想怎么用代码实现这个过程
说白了,就是你先要自己会操作,然后告诉代码如何去操作,让它自动完成你手动操作的步骤
好比一个窗口上有1,2,3,3个按钮.你想先按2,再按1,再按3,就可以用代码去实现顺序点击
而如果你自己都不知道应该先点哪个后点哪个,你就开始编代码,这代码也是无从编起
引用 3 楼 Z65443344 的回复:

如何读取csv文件到内存
用什么结构保存这个数据
如何将内存中的数据insert到数据库
你先研究明白这3个步骤具体如何,再纠结如何结合起来
你文件中的列数量不定,数据库的列数量固定,这完全是你没研究明白业务逻辑导致的
你先抛开代码不要死抠细节,如果就是随便给你个excel文档,让你把数据手动录入到数据库里去,你该怎么办,这个问题想明白了再想怎么用代码实现这个过程

问题分析的挺全面的。你说的,没研究明白业务逻辑导致的,是什么意思呢,我不太懂,领导限我今天交上去,但是我是个菜鸟很多东西也是一知半解,好急。

意思就是其实你根本没有领会领导的意图,不知道领导到底想让你干什么
随便给你个excel表让你手动录入到数据库里去,这不现实.
总归是必须符合某种规律的
而到底是什么规律你根本不清楚
所谓字段不固定,是有些字段可以没有,还是根本就出现了数据库里没有的字段
如果这个你搞不明白,后续工作根本无从做起
引用 6 楼 Z65443344 的回复:

意思就是其实你根本没有领会领导的意图,不知道领导到底想让你干什么
随便给你个excel表让你手动录入到数据库里去,这不现实.
总归是必须符合某种规律的
而到底是什么规律你根本不清楚

领导让我干什么,我还是明白的。我觉得,我现在只是不知道如何把读到datatable里的数据,在顺序不一致情况下插入到数据库里,这个应该是SQL没学好,除了基本语句,复杂一点的对我来说有点困难。


3分
引用 8 楼 huahua1990best 的回复:
Quote: 引用 6 楼 Z65443344 的回复:

意思就是其实你根本没有领会领导的意图,不知道领导到底想让你干什么
随便给你个excel表让你手动录入到数据库里去,这不现实.
总归是必须符合某种规律的
而到底是什么规律你根本不清楚

领导让我干什么,我还是明白的。我觉得,我现在只是不知道如何把读到datatable里的数据,在顺序不一致情况下插入到数据库里,这个应该是SQL没学好,除了基本语句,复杂一点的对我来说有点困难。

写入插入函数,类似这样,
SqlConnection con = new SqlConnection(“Data Source=.;Initial Catalog=data;User ID=sa;password=sa;Integrated Security=False”);  
    //参数化sql语句  
    public void InSertData(string s1,string s2, string s3)//插入数据库    
    {    
        string sql = “insert into table(A,B,C) values(@A, @B, @C)”;  
        using (SqlCommand cmd = new SqlCommand())  
        {  
            cmd.CommandText = sql;  
            cmd.Parameters.AddWithValue(“@A”, s1);  
            cmd.Parameters.AddWithValue(“@B”, s2);  
            cmd.Parameters.AddWithValue(“@C”, s3);                 
            cmd.Connection = con;  
            con.Open();  
            cmd.ExecuteNonQuery();  
        }  
  
    }  
  
    private void button1_Click(object sender, EventArgs e)  
    {  
  
        DataSet ds = getdata();//dataset  
        try  
        {  
            foreach (DataRow dr in ds.Tables[0].Rows)  
            {     
                InSertData(dr[0].ToString(), dr[1].ToString(), dr[2].ToString());  
            }  
        }  
        catch (Exception ex)  
        {  
            MessageBox.Show(ex.Message);  
        }  
  
  
    }  

引用 8 楼 huahua1990best 的回复:
Quote: 引用 6 楼 Z65443344 的回复:

意思就是其实你根本没有领会领导的意图,不知道领导到底想让你干什么
随便给你个excel表让你手动录入到数据库里去,这不现实.
总归是必须符合某种规律的
而到底是什么规律你根本不清楚

领导让我干什么,我还是明白的。我觉得,我现在只是不知道如何把读到datatable里的数据,在顺序不一致情况下插入到数据库里,这个应该是SQL没学好,除了基本语句,复杂一点的对我来说有点困难。

如果你只是纠结这个,1楼就已经回答了
我是针对你2楼的追问说的

引用 9 楼 wind_cloud2011 的回复:
Quote: 引用 8 楼 huahua1990best 的回复:

fieldset>

Quote: 引用 6 楼 Z65443344 的回复:

意思就是其实你根本没有领会领导的意图,不知道领导到底想让你干什么
随便给你个excel表让你手动录入到数据库里去,这不现实.
总归是必须符合某种规律的
而到底是什么规律你根本不清楚

领导让我干什么,我还是明白的。我觉得,我现在只是不知道如何把读到datatable里的数据,在顺序不一致情况下插入到数据库里,这个应该是SQL没学好,除了基本语句,复杂一点的对我来说有点困难。

写入插入函数,类似这样,
SqlConnection con = new SqlConnection(“Data Source=.;Initial Catalog=data;User ID=sa;password=sa;Integrated Security=False”);  
    //参数化sql语句  
    public void InSertData(string s1,string s2, string s3)//插入数据库    
    {    
        string sql = “insert into table(A,B,C) values(@A, @B, @C)”;  
        using (SqlCommand cmd = new SqlCommand())  
        {  
            cmd.CommandText = sql;  
            cmd.Parameters.AddWithValue(“@A”, s1);  
            cmd.Parameters.AddWithValue(“@B”, s2);  
            cmd.Parameters.AddWithValue(“@C”, s3);                 
            cmd.Connection = con;  
            con.Open();  
            cmd.ExecuteNonQuery();  
        }  
  
    }  
  
    private void button1_Click(object sender, EventArgs e)  
    {  
  
        DataSet ds = getdata();//dataset  
        try  
        {  
            foreach (DataRow dr in ds.Tables[0].Rows)  
            {     
                InSertData(dr[0].ToString(), dr[1].ToString(), dr[2].ToString());  
            }  
        }  
        catch (Exception ex)  
        {  
            MessageBox.Show(ex.Message);  
        }  
  
  
    }  

可能是我没说明白,我也想到了参数,但是,我导入的文件里的字段不时的会增加,第一次导入文件里有A、B、C三个字段,数据库里就有三个字段,而第二次可能又增加了一个字段,就变成了A、B、C、D四个字段了,这个时候代码里的字段就不能固定了,怎样动态的把从datatable里的值添加到数据库里呢?

引用 11 楼 huahua1990best 的回复:

可能是我没说明白,我也想到了参数,但是,我导入的文件里的字段不时的会增加,第一次导入文件里有A、B、C三个字段,数据库里就有三个字段,而第二次可能又增加了一个字段,就变成了A、B、C、D四个字段了,这个时候代码里的字段就不能固定了,怎样动态的把从datatable里的值添加到数据库里呢?

你看,我就说你没搞明白业务逻辑吧
这需要你自己先确定如果数据库里没有这个字段,你是动态在数据库里新增一个字段,还是把这个字段丢弃,还是提示用户字段名错误
你不先搞清楚这个,谁知道你到底想怎么办

如果你能够确定表格里所有字段都是数据库里有的字段,只不过有时多,有时少
你需要动态拼接如下sql语句:
insert into table (列1,列2,列3) values (值1,值2,值3)
有就拼接进去,没有就不拼接进去
引用 12 楼 Z65443344 的回复:
Quote: 引用 11 楼 huahua1990best 的回复:

可能是我没说明白,我也想到了参数,但是,我导入的文件里的字段不时的会增加,第一次导入文件里有A、B、C三个字段,数据库里就有三个字段,而第二次可能又增加了一个字段,就变成了A、B、C、D四个字段了,这个时候代码里的字段就不能固定了,怎样动态的把从datatable里的值添加到数据库里呢?

你看,我就说你没搞明白业务逻辑吧
这需要你自己先确定如果数据库里没有这个字段,你是动态在数据库里新增一个字段,还是把这个字段丢弃,还是提示用户字段名错误
你不先搞清楚这个,谁知道你到底想怎么办

呃,我在读CSV文件的时候已经把这个没有的字段添加到数据库里了,可能是我没说明白。

而且这样拼接,你可以不考虑表格里的数据顺序到底是否和数据库里的顺序相同
完全可以这样:
insert into table (列15,列2,列19) values (值15,值2,值19)
引用 15 楼 Z65443344 的回复:

而且这样拼接,你可以不考虑表格里的数据顺序到底是否和数据库里的顺序相同
完全可以这样:
insert into table (列15,列2,列19) values (值15,值2,值19)

我还是不明白,这样写和insert into table(A,B,C) values (值A,值B,值C)有什么区别,也需要对应啊,因为我之前是下面这么写的,不涉及到新加字段的问题,所以现在一直绕不过弯来。
DataTable dt = CsvHelper.OpenCSV(filePath);
for (int i = 0; i < dt.Rows.Count; i++)
{
              A = dt.Rows[i][0].ToString();
              B = dt.Rows[i][1].ToString();
              C = dt.Rows[i][2].ToString();
}
string strSql=“insert into table (A,B,C)  values (“”+A+””,””+B+””,””+C+””)”;
DbHelperSQL.ExecuteSql(strSql);


32分
不是说了吗,动态拼接sql语句,不要写死
比如这样:
pre class=”brush: csharp”>
string sqlstring=”insert into table (“;
for(int l=0;l<dt.Columns.Count;l++)
{
sqlstring+=dt.Columns[l].Name+”,”;//列名拼接
}
sqlstring.TrimEnd(“,”);//去掉最后一个多余的逗号
sqlstring+=”) values (“;
for(int l=0;l<dt.Columns.Count;l++)
{
sqlstring+=dt.Rows[r][l]+”,”;//值拼接
}
sqlstring.TrimEnd(“,”);//去掉最后一个多余的逗号
sqlstring+=”)”;
/pre>
有点错误,改改
string sqlstring=”insert into table (“;
for(int l=0;l<dt.Columns.Count;l++)
{
sqlstring+=dt.Columns[l].Name+”,”;//列名拼接
}
span style=”color: #FF0000;”>sqlstring=sqlstring.TrimEnd(“,”);//去掉最后一个多余的逗号
sqlstring+=”) values (“;
for(int l=0;l<dt.Columns.Count;l++)
{
sqlstring+=dt.Rows[r][l]+”,”;//值拼接
}
span style=”color: #FF0000;”>sqlstring=sqlstring.TrimEnd(“,”);//去掉最后一个多余的逗号
sqlstring+=”)”;
你数据 库的字段应该是固定的,拼接sql语句方法外,你可以多写几个插入函数,根据字段数,来调用函数,
搞得好复杂阿
引用 19 楼 wind_cloud2011 的回复:

你数据 库的字段应该是固定的,拼接sql语句方法外,你可以多写几个插入函数,根据字段数,来调用函数,
搞得好复杂阿

呵呵,交给我的需求就是这么复杂。。。

引用 18 楼 Z65443344 的回复:

有点错误,改改
string sqlstring=”insert into table (“;
for(int l=0;l<dt.Columns.Count;l++)
{
sqlstring+=dt.Columns[l].Name+”,”;//列名拼接
}
span style=”color: #FF0000;”>sqlstring=sqlstring.TrimEnd(“,”);//去掉最后一个多余的逗号
sqlstring+=”) values (“;
for(int l=0;l<dt.Columns.Count;l++)
{
sqlstring+=dt.Rows[r][l]+”,”;//值拼接
}
span style=”color: #FF0000;”>sqlstring=sqlstring.TrimEnd(“,”);//去掉最后一个多余的逗号
sqlstring+=”)”;

非常感谢~~~


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明csv文件导入使插入到数据库中的数据与表中的字段顺序对应