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

c# 同时被 2 个专栏收录
17 篇文章 0 订阅

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

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

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;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

  • 0
    点赞
  • 0
    评论
  • 6
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

DenggLin

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值