c# 命令行操作数据库并将数据导出到csv

来源:互联网 发布:众人匹之 不亦悲乎 编辑:程序博客网 时间:2024/05/22 04:49

记录一下,方便自己下次使用也总结一下让自己彻底理解

先上主体代码,然后我会一点点开始解释:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Data;using System.Data.SqlClient;using System.Configuration;using System.IO;namespace sqlQuery{  class Program  {    static void Main(string[] args)    {      string fileName = "E:\\wdltest\\createcsv\\wdll.csv";      SaveCSV(PETable(), fileName);    }    private static string GetPath(string fileName)    {      return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "sql", fileName);    }    public static DataTable PETable(){      //定义连接字符串      string connString = ConfigurationManager.ConnectionStrings["db_conn"].ConnectionString;      SqlConnection sConn = new SqlConnection(connString);      DataSet dtSet = new DataSet();      DataSet dtSetEnd = new DataSet();      try      {        sConn.Open();      }      catch (Exception ex)      {        Console.WriteLine("连接错误:" + ex.Message);      }      //read users      string[] users = File.ReadLines(GetPath("users.txt")).ToArray();      string users_string = "'" + string.Join("','", users) + "'";      //set sqlquery      string sql = File.ReadAllText(GetPath("s1.sql"));      sql = sql.Replace("{USERS}", users_string);            SqlCommand sCmd = new SqlCommand(sql, sConn);      SqlDataAdapter sqlAdapter = new SqlDataAdapter(sCmd);      sqlAdapter.Fill(dtSet);      //start update      string Tupdate = File.ReadAllText(GetPath("update.sql"));      Tupdate = Tupdate.Replace("{USERS}", users_string);      SqlCommand sUpdate = new SqlCommand(Tupdate, sConn);      int effectedRows = sUpdate.ExecuteNonQuery();      Console.WriteLine("update end");      //updateAfterQuery      string updateAfterQuery = File.ReadAllText(GetPath("updateAfter.sql"));      updateAfterQuery = updateAfterQuery.Replace("{USERS}", users_string);      SqlCommand sCmdUpdateAfter = new SqlCommand(updateAfterQuery, sConn);      SqlDataAdapter sqlFinallyUpdate = new SqlDataAdapter(sCmdUpdateAfter);      sqlFinallyUpdate.Fill(dtSetEnd);      return dtSetEnd.Tables[0];    }    public static void SaveCSV(DataTable dt, string fileName)    {      FileStream fs = new FileStream(fileName, System.IO.FileMode.Create, System.IO.FileAccess.Write);//读取文件,fileMode类型为Create即先删除后新建,fileAccess权限为写      StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default);//转下编码      string data = "";      //write colData      for (int i = 0; i < dt.Columns.Count; i++)      {        data += dt.Columns[i].ColumnName.ToString();        if (i < dt.Columns.Count - 1)        {          data += ",";        }      }      sw.WriteLine(data);      //weite RowData      if (dt.Rows.Count>0)      {        Console.WriteLine("start write rows data");        for (int i = 0; i < dt.Rows.Count; i++)        {          data = "";          for (int j = 0; j < dt.Columns.Count; j++)          {            data += dt.Rows[i][j].ToString()==""?"null": dt.Rows[i][j].ToString();            if (j < dt.Columns.Count - 1)            {              data += ",";            }          }          sw.WriteLine(data);        }      }      else      {        Console.WriteLine("data empty");      }      sw.Close();      fs.Close();      Console.WriteLine("End ALl");      Console.ReadKey();    }  }}

Appconfig

<?xml version="1.0" encoding="utf-8" ?><configuration>    <startup>         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />    </startup>  <connectionStrings>    <add name="db_conn" connectionString="server=.;database=wdl;uid=wdl;pwd=123456;MultipleActiveResultSets=true" />  </connectionStrings></configuration>

要操作数据库首先要引入这两个

using System.Data;using System.Data.SqlClient;

先说PETable
为了将数据转为DataTable 存储,方便导出csv.
使用dataTable也要加

using System.Data;//前面已经加过

获取appconfig里的服务器链接地址

 string connString = ConfigurationManager.ConnectionStrings["db_conn"].ConnectionString;

new SqlConnection 是new 一个sql链接
然后sConn.Open(); 打开数据库连接

DataSet

DataSet类是ADO.NET中最核心的成员之一,每一个DataSet都有很多个DataTables和Relationships。每一个DataTable都有很多datarows和datacols, 也包括ParentRelations,ChildRelations 和一些限制条件像主键不可以重复的限制。

DataSet每一行有一个RowState属性。主要是反映当前行是否已经被删掉了,被更新了,还是本没变。有如下的几个选项: Deleted, Modified, New, and Unchanged。

对DataSet的任何操作,都是在计算机缓存中完成的。
在从数据库完成数据抽取后,DataSet就是数据的存放地,它是各种数据源中的数据在计算机内存中映射成的缓存,所以有时说DataSet可以看成是一个数据容器。
DataSet对象是一个可以用XML形式表示的数据视图,是一种数据关系视图。

DataSet使用方法一般有三种:
1.把数据库中的数据通过DataAdapter对象填充DataSet
DataAdapter填充DataSet的过程分为二步:首先通过DataAdapter的SqlCommand属性从数据库中检索出需要的数据。SqlCommand其实是一个Command对象。然后再通过DataAdapter的Fill方法把检索来的数据填充DataSet。

2.通过DataAdapter对象操作DataSet实现更新数据库
DataAdapter是通过其Update方法实现以DataSet中数据来更新数据库的。当DataSet实例中包含数据发生更改后,此时调用Update方法,DataAdapter 将分析已作出的更改并执行相应的命令(INSERT、UPDATE 或 DELETE),并以此命令来更新数据库中的数据。

  1. 把XML数据流或文本加载到DataSet
    DataSet中的数据可以从XML数据流或文档创建。加载XML数据流和文档到DataSet中是可使用DataSet对象的ReadXml方法。

    数据绑定分成二类:简单型数据绑定和复杂型数据绑定。适用于简单型数据绑定组件一般有Lable、TextBox等,适用于复杂性数据绑定的组件一般有DataGrid、ListBox、ComboBox等。

      简单型数据绑定一般使用这些组件中的DataBindings属性的Add方法把DataSet中某一个DataTable中的某一行和组件的某个属性绑定起来,从而达到显示数据的效果。

比如:textBox1.DataBindings.Add ( “Text” , dsDataSet1, ” Customers. CustomerID “) ;

复杂性数据绑定一般是设定组件的DataSource属性和DisplayMember属性来完成数据绑定的。DataSource属性值一般设定为要绑定的DataSet,DisplayMember属性值一般设定为要绑定的数据表或数据表中的某一列。
比如:dataGrid1.DataSource = dsDataSet1 ;
dataGrid1.DataMember = ” Customers ” ;

DataSet的属性Tables可以获取该DATASET中表的数量:DataSet.Tables.Count

DataSet的Tables是一个Table数组,指定其中的一个表:DataSet.Tables[i];//i为

Table在数组序列中的位置 或 DataSet.Tables[“表名”];

通过Table的Rows对象组的Count获取该表的记录数:DataSet.Tables[i].Rows.Count;

获取列数:DataSet.Tables[i].Columns.Count;

我们想要操作文件一般如下:

引用命名空间using System.IO;

首先介绍下FileStream和File的区别
例如,我们要读取一个很大的文件,然后将文件的内容通过控制台打印出来。

File:将文件一下子全部读出来,然后打印到控制台。File:缺点:消耗内存比较大
FileStream:先读一点文件,然后打印到控制台,再继续读一点文件,再打印到控制台,如此循环,直到读完为止。FileStream优点:消耗内存比较小

一、读取文件
FileStream 类只能处理原始字节(raw byte)。FileStream 类可以用于任何数据文件,而不仅仅是文本文件。FileStream 对象可以用于读取诸如图像和声音的文件,FileStream读取出来的是字节数组,然后通过编码转换将字节数组转换成字符串。
声明一个FileStream类的对象

       FileStream fsRead = new FileStream(string path, FileMode mode, FileAccess access);

参数:

path:要操作的文件路径,路径可以是绝对路径或者相对路径。mode:操作文件的方式,打开或者创建//FileMode.Create;Openhttp://blog.csdn.net/laoniu541292552/article/details/8072180access:操作文件中的数据,读取或者写入//Read打开文件,用于只读;Write打开文件,用于只写;ReadWrite打开文件,用于读写FileStream.Read(byte[] array, int offset, int count)方法是从文件中读取数据,再把数据写入一个字节数组参数:array:用来存储FileStrem对象读取到的数据offse:开始读取数据的位置,通常都是0count:表示从文件中读取多少字节

源代码地址:

http://download.csdn.net/download/qq_34117170/9975411