您的位置:首页 > 数据库

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

2017-09-12 17:03 1551 查看
记录一下,方便自己下次使用也总结一下让自己彻底理解

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

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),并以此命令来更新数据库中的数据。

把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;Open http://blog.csdn.net/laoniu541292552/article/details/8072180 
access:操作文件中的数据,读取或者写入//Read打开文件,用于只读;Write打开文件,用于只写;ReadWrite打开文件,用于读写
FileStream.Read(byte[] array, int offset, int count)方法是从文件中读取数据,再把数据写入一个字节数组
参数:
array:用来存储FileStrem对象读取到的数据
offse:开始读取数据的位置,通常都是0
count:表示从文件中读取多少字节


源代码地址:

http://download.csdn.net/download/qq_34117170/9975411
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: