using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using CnasSynchronousCommon;
using CnasSynchrousModel;
namespace CnasSynchronusDAL
{
public static class SqlServerDAL
{
///
/// 数据库连接字符串
///
private static string connectionStr ="";
public static void CreateConnection(SqlServerOpenParams t)
{
if (!string.IsNullOrWhiteSpace(t.StrConnecttion))
SqlServerDAL.connectionStr = $"Data Source = {t.StrHost}; Initial Catalog = {t.StrServer}; User Id = {t.StrUser}; Password = {t.StrPwd};Port={t.StrPort}";
else
SqlServerDAL.connectionStr = t.StrConnecttion;
}
///
/// 查询操作
///
///
///
public static DataTable GetDataTable(string sql, params SqlParameter[] sp)
{
using (SqlConnection conn = new SqlConnection(connectionStr))
{
conn.Open();
using (SqlDataAdapter sda = new SqlDataAdapter(sql, conn))
{
sda.SelectCommand.Parameters.AddRange(sp);
DataTable dt = new DataTable();
sda.Fill(dt);
return dt;
}
}
}
internal static DataTable GetDataStruct(string strTableName,string strViewName,string strViewSql)
{
string strSql = "";
if (strViewName == strTableName && !string.IsNullOrWhiteSpace(strViewName))
strSql = strViewSql + $" where 1=0";
else
strSql = $"select * from {strTableName} where 1=0";
return GetDataTable(strSql, new SqlParameter[] { });
}
///
/// 增删改操作
///
/// sql语句
/// 执行后的条数
public static int ExecuteNonQuery(string sql, params SqlParameter[] sp)
{
using (SqlConnection conn = new SqlConnection(connectionStr))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddRange(sp);
int i = cmd.ExecuteNonQuery();
return i;
}
}
}
///
/// 执行一条SQL语句,返回首行首列
///
/// sql语句
/// 首行首列
public static object ExecuteScalar(string sql, params SqlParameter[] sp)
{
using (SqlConnection conn = new SqlConnection(connectionStr))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddRange(sp);
return cmd.ExecuteScalar();
}
}
}
///
/// 根据表名获取数据
///
///
///
public static DataTable GetDataByTableName(string strTableName)
{
return GetDataTable($"select * from {strTableName}",new SqlParameter[] { });
}
///
/// 根据表名,时间列,时间值,获得表中所有大于该时间的行集合
///
///
///
///
///
public static DataTable GetDataByDateColumn(string strViewName,string strViewSql,string strTableName, string strColumnName, string strColumnValue)
{
DataTable dtReturn = new DataTable();
try
{
string strSql = "";
if (strViewName == strTableName && !string.IsNullOrWhiteSpace(strViewName))
strSql = strViewSql+ $" where {strColumnName} > '{strColumnValue}'";
else
strSql = $"select * from {strTableName} where {strColumnName} > '{strColumnValue}'";
DataTable dt = GetDataTable(strSql, new SqlParameter[] { });
Dictionary dictFiled = GetSpecialOperaField(strTableName);
if (dictFiled.Count > 0)
dtReturn = DateAndTimeTypeOpera(dt, dictFiled);
else
dtReturn = dt;
}
catch (Exception ex)
{
//发生异常,写入日志
AppLog.Error(ex.Message);
}
return dtReturn;
}
public static Dictionary GetAllTableNameAndStructure()
{
Dictionary dictTables = new Dictionary();
try
{
string sql = "";
DataTable TablesName = GetDataTable("SELECT name FROM SysObjects Where XType='U' or XType='V' ORDER BY Name", new SqlParameter[] { });//得到所有表
foreach (DataRow dr in TablesName.Rows)
{
string strTableName = dr[0].ToString();
sql = string.Format("SELECT * FROM [{0}] where 1=0", strTableName); //查询字符串
dictTables.Add(strTableName.ToUpper(), GetDataTable(sql, new SqlParameter[] { }));
}
}
catch (Exception ex)
{
//发生异常,写入日志
AppLog.Error(ex.Message);
//throw ex;
}
return dictTables;
}
public static bool TestSQLServerLink()
{
bool bIfSuccess = false;
using (SqlConnection conn = new SqlConnection(connectionStr))
{
try
{
conn.Open();
bIfSuccess = true;
}
catch (Exception ex)
{
//这里写日志
bIfSuccess = false;
AppLog.Error(ex.Message);
}
}
return bIfSuccess;
}
///
/// 获取所有数据字段,然后记录其中是否存在需要特殊处理的字段
///
///
private static Dictionary GetSpecialOperaField(string strTableName)
{
Dictionary DictFiled = new Dictionary();
DataTable dt = new DataTable();
try
{
string sql = string.Format("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='{0}'", strTableName); //查询字符串
dt = GetDataTable(sql, new SqlParameter[] { });
foreach (DataRow dr in dt.Rows)
{
//AppLog.Info(string.Format("列名:{0},类型:{1}", dr["column_name"].ToString(), dr["data_type"].ToString()));
if (dr["data_type"].ToString().ToLower() == "date" || dr["data_type"].ToString().ToLower() == "time")
{
DictFiled.Add(dr["column_name"].ToString(), dr["data_type"].ToString());
}
if (dr["data_type"].ToString().ToLower() == "varbinary"|| dr["data_type"].ToString().ToLower() == "image")
{
DictFiled.Add(dr["column_name"].ToString(), dr["data_type"].ToString());
}
}
}
catch (Exception ex)
{
//发生异常,写入日志
AppLog.Error(ex.Message);
}
return DictFiled;
}
///
/// 获取数据时,单独处理某些(Date和Time)类型数据,并把数据类型转换为字符串类型
///
private static DataTable DateAndTimeTypeOpera(DataTable dt, Dictionary DictSpecialField)
{
DataTable dtNewFormat = new DataTable();
//添加列
foreach (DataColumn dc in dt.Columns)
{
if (DictSpecialField.ContainsKey(dc.ColumnName))
{
string strDateType = DictSpecialField[dc.ColumnName];
switch (strDateType.ToUpper())
{
case "DATE":
case "TIME":
dtNewFormat.Columns.Add(dc.ColumnName, typeof(string)); //使用字符串来存储该字段,而不是采用它的数据库格式(C#无法区分Date, Time,DateTime,前两种格式会自动补充数据,导致数据的不准确)
break;
case "IMAGE":
case "VARBINARY":
dtNewFormat.Columns.Add(dc.ColumnName, typeof(string));
break;
default:
dtNewFormat.Columns.Add(dc.ColumnName, dc.DataType);
break;
}
}
else
{
dtNewFormat.Columns.Add(dc.ColumnName, dc.DataType);
}
}
//添加数据行
foreach (DataRow dr in dt.Rows)
{
DataRow drNewRow = dtNewFormat.NewRow();
foreach (DataColumn dc in dtNewFormat.Columns)
{
if (!DictSpecialField.ContainsKey(dc.ColumnName))
drNewRow[dc.ColumnName] = dr[dc.ColumnName];
else
{
switch (DictSpecialField[dc.ColumnName].ToUpper())
{
case "DATE":
if (dr[dc.ColumnName] != null && dr[dc.ColumnName].ToString() != "")
drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName]).ToString("yyyy-MM-dd");
break;
case "TIME":
if (dr[dc.ColumnName] != null && dr[dc.ColumnName].ToString() != "")
drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName].ToString()).ToString("HH:mm:ss");
break;
case "IMAGE":
case "VARBINARY":
if(dr[dc.ColumnName]!=null&& dr[dc.ColumnName].ToString()!="")
drNewRow[dc.ColumnName] = System.Text.Encoding.Default.GetString(dr[dc.ColumnName] as byte[]);
break;
default:
drNewRow[dc.ColumnName] = dr[dc.ColumnName];
break;
}
}
}
dtNewFormat.Rows.Add(drNewRow);
}
//返回数据
return dtNewFormat;
}
}
}