CNAS取数仪器端升级
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

288 lines
11KB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.SqlClient;
  5. using System.Linq;
  6. using System.Text;
  7. using CnasSynchronousCommon;
  8. using CnasSynchrousModel;
  9. namespace CnasSynchronusDAL
  10. {
  11. public static class SqlServerDAL
  12. {
  13. /// <summary>
  14. /// 数据库连接字符串
  15. /// </summary>
  16. private static string connectionStr ="";
  17. public static void CreateConnection(SqlServerOpenParams t)
  18. {
  19. if (!string.IsNullOrWhiteSpace(t.StrConnecttion))
  20. SqlServerDAL.connectionStr = $"Data Source = {t.StrHost}; Initial Catalog = {t.StrServer}; User Id = {t.StrUser}; Password = {t.StrPwd};Port={t.StrPort}";
  21. else
  22. SqlServerDAL.connectionStr = t.StrConnecttion;
  23. }
  24. /// <summary>
  25. /// 查询操作
  26. /// </summary>
  27. /// <param name="sql"></param>
  28. /// <returns></returns>
  29. public static DataTable GetDataTable(string sql, params SqlParameter[] sp)
  30. {
  31. using (SqlConnection conn = new SqlConnection(connectionStr))
  32. {
  33. conn.Open();
  34. using (SqlDataAdapter sda = new SqlDataAdapter(sql, conn))
  35. {
  36. sda.SelectCommand.Parameters.AddRange(sp);
  37. DataTable dt = new DataTable();
  38. sda.Fill(dt);
  39. return dt;
  40. }
  41. }
  42. }
  43. internal static DataTable GetDataStruct(string strTableName,string strViewName,string strViewSql)
  44. {
  45. string strSql = "";
  46. if (strViewName == strTableName && !string.IsNullOrWhiteSpace(strViewName))
  47. strSql = strViewSql + $" where 1=0";
  48. else
  49. strSql = $"select * from {strTableName} where 1=0";
  50. return GetDataTable(strSql, new SqlParameter[] { });
  51. }
  52. /// <summary>
  53. /// 增删改操作
  54. /// </summary>
  55. /// <param name="sql">sql语句</param>
  56. /// <returns>执行后的条数</returns>
  57. public static int ExecuteNonQuery(string sql, params SqlParameter[] sp)
  58. {
  59. using (SqlConnection conn = new SqlConnection(connectionStr))
  60. {
  61. conn.Open();
  62. using (SqlCommand cmd = new SqlCommand(sql, conn))
  63. {
  64. cmd.Parameters.AddRange(sp);
  65. int i = cmd.ExecuteNonQuery();
  66. return i;
  67. }
  68. }
  69. }
  70. /// <summary>
  71. /// 执行一条SQL语句,返回首行首列
  72. /// </summary>
  73. /// <param name="sql">sql语句</param>
  74. /// <returns>首行首列</returns>
  75. public static object ExecuteScalar(string sql, params SqlParameter[] sp)
  76. {
  77. using (SqlConnection conn = new SqlConnection(connectionStr))
  78. {
  79. conn.Open();
  80. using (SqlCommand cmd = new SqlCommand(sql, conn))
  81. {
  82. cmd.Parameters.AddRange(sp);
  83. return cmd.ExecuteScalar();
  84. }
  85. }
  86. }
  87. /// <summary>
  88. /// 根据表名获取数据
  89. /// </summary>
  90. /// <param name="strTableName"></param>
  91. /// <returns></returns>
  92. public static DataTable GetDataByTableName(string strTableName)
  93. {
  94. return GetDataTable($"select * from {strTableName}",new SqlParameter[] { });
  95. }
  96. /// <summary>
  97. /// 根据表名,时间列,时间值,获得表中所有大于该时间的行集合
  98. /// </summary>
  99. /// <param name="strTableName"></param>
  100. /// <param name="strColumnName"></param>
  101. /// <param name="strColumnValue"></param>
  102. /// <returns></returns>
  103. public static DataTable GetDataByDateColumn(string strViewName,string strViewSql,string strTableName, string strColumnName, string strColumnValue)
  104. {
  105. DataTable dtReturn = new DataTable();
  106. try
  107. {
  108. string strSql = "";
  109. if (strViewName == strTableName && !string.IsNullOrWhiteSpace(strViewName))
  110. strSql = strViewSql+ $" where {strColumnName} > '{strColumnValue}'";
  111. else
  112. strSql = $"select * from {strTableName} where {strColumnName} > '{strColumnValue}'";
  113. DataTable dt = GetDataTable(strSql, new SqlParameter[] { });
  114. Dictionary<string, string> dictFiled = GetSpecialOperaField(strTableName);
  115. if (dictFiled.Count > 0)
  116. dtReturn = DateAndTimeTypeOpera(dt, dictFiled);
  117. else
  118. dtReturn = dt;
  119. }
  120. catch (Exception ex)
  121. {
  122. //发生异常,写入日志
  123. AppLog.Error(ex.Message);
  124. }
  125. return dtReturn;
  126. }
  127. public static Dictionary<string, DataTable> GetAllTableNameAndStructure()
  128. {
  129. Dictionary<string, DataTable> dictTables = new Dictionary<string, DataTable>();
  130. try
  131. {
  132. string sql = "";
  133. DataTable TablesName = GetDataTable("SELECT name FROM SysObjects Where XType='U' or XType='V' ORDER BY Name", new SqlParameter[] { });//得到所有表
  134. foreach (DataRow dr in TablesName.Rows)
  135. {
  136. string strTableName = dr[0].ToString();
  137. sql = string.Format("SELECT * FROM [{0}] where 1=0", strTableName); //查询字符串
  138. dictTables.Add(strTableName.ToUpper(), GetDataTable(sql, new SqlParameter[] { }));
  139. }
  140. }
  141. catch (Exception ex)
  142. {
  143. //发生异常,写入日志
  144. AppLog.Error(ex.Message);
  145. //throw ex;
  146. }
  147. return dictTables;
  148. }
  149. public static bool TestSQLServerLink()
  150. {
  151. bool bIfSuccess = false;
  152. using (SqlConnection conn = new SqlConnection(connectionStr))
  153. {
  154. try
  155. {
  156. conn.Open();
  157. bIfSuccess = true;
  158. }
  159. catch (Exception ex)
  160. {
  161. //这里写日志
  162. bIfSuccess = false;
  163. AppLog.Error(ex.Message);
  164. }
  165. }
  166. return bIfSuccess;
  167. }
  168. /// <summary>
  169. /// 获取所有数据字段,然后记录其中是否存在需要特殊处理的字段
  170. /// </summary>
  171. /// <returns></returns>
  172. private static Dictionary<string, string> GetSpecialOperaField(string strTableName)
  173. {
  174. Dictionary<string, string> DictFiled = new Dictionary<string, string>();
  175. DataTable dt = new DataTable();
  176. try
  177. {
  178. string sql = string.Format("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='{0}'", strTableName); //查询字符串
  179. dt = GetDataTable(sql, new SqlParameter[] { });
  180. foreach (DataRow dr in dt.Rows)
  181. {
  182. //AppLog.Info(string.Format("列名:{0},类型:{1}", dr["column_name"].ToString(), dr["data_type"].ToString()));
  183. if (dr["data_type"].ToString().ToLower() == "date" || dr["data_type"].ToString().ToLower() == "time")
  184. {
  185. DictFiled.Add(dr["column_name"].ToString(), dr["data_type"].ToString());
  186. }
  187. if (dr["data_type"].ToString().ToLower() == "varbinary"|| dr["data_type"].ToString().ToLower() == "image")
  188. {
  189. DictFiled.Add(dr["column_name"].ToString(), dr["data_type"].ToString());
  190. }
  191. }
  192. }
  193. catch (Exception ex)
  194. {
  195. //发生异常,写入日志
  196. AppLog.Error(ex.Message);
  197. }
  198. return DictFiled;
  199. }
  200. /// <summary>
  201. /// 获取数据时,单独处理某些(Date和Time)类型数据,并把数据类型转换为字符串类型
  202. /// </summary>
  203. private static DataTable DateAndTimeTypeOpera(DataTable dt, Dictionary<string, string> DictSpecialField)
  204. {
  205. DataTable dtNewFormat = new DataTable();
  206. //添加列
  207. foreach (DataColumn dc in dt.Columns)
  208. {
  209. if (DictSpecialField.ContainsKey(dc.ColumnName))
  210. {
  211. string strDateType = DictSpecialField[dc.ColumnName];
  212. switch (strDateType.ToUpper())
  213. {
  214. case "DATE":
  215. case "TIME":
  216. dtNewFormat.Columns.Add(dc.ColumnName, typeof(string)); //使用字符串来存储该字段,而不是采用它的数据库格式(C#无法区分Date, Time,DateTime,前两种格式会自动补充数据,导致数据的不准确)
  217. break;
  218. case "IMAGE":
  219. case "VARBINARY":
  220. dtNewFormat.Columns.Add(dc.ColumnName, typeof(string));
  221. break;
  222. default:
  223. dtNewFormat.Columns.Add(dc.ColumnName, dc.DataType);
  224. break;
  225. }
  226. }
  227. else
  228. {
  229. dtNewFormat.Columns.Add(dc.ColumnName, dc.DataType);
  230. }
  231. }
  232. //添加数据行
  233. foreach (DataRow dr in dt.Rows)
  234. {
  235. DataRow drNewRow = dtNewFormat.NewRow();
  236. foreach (DataColumn dc in dtNewFormat.Columns)
  237. {
  238. if (!DictSpecialField.ContainsKey(dc.ColumnName))
  239. drNewRow[dc.ColumnName] = dr[dc.ColumnName];
  240. else
  241. {
  242. switch (DictSpecialField[dc.ColumnName].ToUpper())
  243. {
  244. case "DATE":
  245. if (dr[dc.ColumnName] != null && dr[dc.ColumnName].ToString() != "")
  246. drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName]).ToString("yyyy-MM-dd");
  247. break;
  248. case "TIME":
  249. if (dr[dc.ColumnName] != null && dr[dc.ColumnName].ToString() != "")
  250. drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName].ToString()).ToString("HH:mm:ss");
  251. break;
  252. case "IMAGE":
  253. case "VARBINARY":
  254. if(dr[dc.ColumnName]!=null&& dr[dc.ColumnName].ToString()!="")
  255. drNewRow[dc.ColumnName] = System.Text.Encoding.Default.GetString(dr[dc.ColumnName] as byte[]);
  256. break;
  257. default:
  258. drNewRow[dc.ColumnName] = dr[dc.ColumnName];
  259. break;
  260. }
  261. }
  262. }
  263. dtNewFormat.Rows.Add(drNewRow);
  264. }
  265. //返回数据
  266. return dtNewFormat;
  267. }
  268. }
  269. }