|
|
|
@ -0,0 +1,828 @@
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Security.Policy;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using MySql.Data.MySqlClient;
|
|
|
|
|
using Dapper;
|
|
|
|
|
using ZKLT.Hadoop.Interface;
|
|
|
|
|
using ZKLT.Hadoop.Model;
|
|
|
|
|
using MySqlX.XDevAPI.Relational;
|
|
|
|
|
using Mysqlx.Crud;
|
|
|
|
|
|
|
|
|
|
namespace ZKLT.Hadoop
|
|
|
|
|
{
|
|
|
|
|
public class TableService : ITableService
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 同步结构
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="source">数据源</param>
|
|
|
|
|
/// <param name="table">数据表</param>
|
|
|
|
|
/// <returns>是否成功</returns>
|
|
|
|
|
public bool InitStruct(HDP_Source source, HDP_Table table)
|
|
|
|
|
{
|
|
|
|
|
//数据校验
|
|
|
|
|
if (string.IsNullOrEmpty(table.Key))
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("表键无效");
|
|
|
|
|
}
|
|
|
|
|
if (table.Columns == null || table.Columns.Length == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("列无效");
|
|
|
|
|
}
|
|
|
|
|
using (MySqlConnection _connection = new MySqlConnection(source.GetConnectString()))
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
_connection.Open();
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException("数据源连接失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
StringBuilder _command = new StringBuilder();
|
|
|
|
|
if (DbExistTable(source, table.Key))
|
|
|
|
|
{
|
|
|
|
|
var _dbColumns = DbGetColumns(source, table.Key);
|
|
|
|
|
_command.AppendLine($@"ALTER TABLE `{table.Key}`");
|
|
|
|
|
_command.AppendLine("DROP PRIMARY KEY,");
|
|
|
|
|
|
|
|
|
|
//加载列
|
|
|
|
|
for (var i = 0; i < table.Columns.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
StringBuilder _colstr = new StringBuilder();
|
|
|
|
|
var _column = table.Columns[i];
|
|
|
|
|
if (_dbColumns.Any(x => x.Key == _column.Key))
|
|
|
|
|
{
|
|
|
|
|
_colstr.Append($@"MODIFY `{_column.Key}`");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
_colstr.Append($@"ADD `{_column.Key}`");
|
|
|
|
|
}
|
|
|
|
|
switch (_column.DataType)
|
|
|
|
|
{
|
|
|
|
|
case HDP_ColumnDataType.VARCHAR:
|
|
|
|
|
if (_column.Length == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException(@$"列{_column.Key}长度无效");
|
|
|
|
|
}
|
|
|
|
|
_colstr.Append($@" {_column.DataType}({_column.Length})");
|
|
|
|
|
break;
|
|
|
|
|
case HDP_ColumnDataType.DECIMAL:
|
|
|
|
|
if (_column.Length == 0 || _column.DecimalLength == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException(@$"列{_column.Key}长度无效");
|
|
|
|
|
}
|
|
|
|
|
_colstr.Append($@" {_column.DataType}({_column.Length},{_column.DecimalLength})");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
_colstr.Append(@$" {_column.DataType}");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (!string.IsNullOrEmpty(_column.Description))
|
|
|
|
|
{
|
|
|
|
|
_colstr.Append($@" COMMENT '{_column.Description}'");
|
|
|
|
|
}
|
|
|
|
|
_colstr.Append(",");
|
|
|
|
|
_command.AppendLine(_colstr.ToString());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//加载主键
|
|
|
|
|
var _primarys = table.Columns.Where(x => x.IsPrimary == true).ToArray();
|
|
|
|
|
if (_primarys.Length > 0)
|
|
|
|
|
{
|
|
|
|
|
StringBuilder _primaryStr = new StringBuilder();
|
|
|
|
|
_primaryStr.Append("ADD PRIMARY KEY (");
|
|
|
|
|
for (var i = 0; i < _primarys.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
var _primary = _primarys[i];
|
|
|
|
|
_primaryStr.Append($@"`{_primary.Key}`");
|
|
|
|
|
if (i < _primarys.Length - 1)
|
|
|
|
|
{
|
|
|
|
|
_primaryStr.Append(",");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
_primaryStr.Append(")");
|
|
|
|
|
_command.AppendLine(_primaryStr.ToString());
|
|
|
|
|
}
|
|
|
|
|
if (!string.IsNullOrEmpty(table.Description))
|
|
|
|
|
{
|
|
|
|
|
_command.AppendLine(@$"COMMENT '{table.Description}'");
|
|
|
|
|
}
|
|
|
|
|
_connection.Execute(_command.ToString());
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
_command.AppendLine($@"CREATE TABLE `{table.Key}` (");
|
|
|
|
|
|
|
|
|
|
//加载列
|
|
|
|
|
for (int i = 0; i < table.Columns.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
StringBuilder _colstr = new StringBuilder();
|
|
|
|
|
var _column = table.Columns[i];
|
|
|
|
|
_colstr.Append($@"`{_column.Key}`");
|
|
|
|
|
switch (_column.DataType)
|
|
|
|
|
{
|
|
|
|
|
case HDP_ColumnDataType.VARCHAR:
|
|
|
|
|
if (_column.Length == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException(@$"列{_column.Key}长度无效");
|
|
|
|
|
}
|
|
|
|
|
_colstr.Append($@" {_column.DataType}({_column.Length})");
|
|
|
|
|
break;
|
|
|
|
|
case HDP_ColumnDataType.DECIMAL:
|
|
|
|
|
if (_column.Length == 0 || _column.DecimalLength == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException(@$"列{_column.Key}长度无效");
|
|
|
|
|
}
|
|
|
|
|
_colstr.Append($@" {_column.DataType}({_column.Length},{_column.DecimalLength})");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
_colstr.Append(@$" {_column.DataType}");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (!string.IsNullOrEmpty(_column.Description))
|
|
|
|
|
{
|
|
|
|
|
_colstr.Append($@" COMMENT '{_column.Description}'");
|
|
|
|
|
}
|
|
|
|
|
if (i < table.Columns.Length - 1)
|
|
|
|
|
{
|
|
|
|
|
_colstr.Append(",");
|
|
|
|
|
}
|
|
|
|
|
_command.AppendLine(_colstr.ToString());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//加载主键
|
|
|
|
|
var _primarys = table.Columns.Where(x => x.IsPrimary == true).ToArray();
|
|
|
|
|
if (_primarys.Length > 0)
|
|
|
|
|
{
|
|
|
|
|
_command.Append(",");
|
|
|
|
|
StringBuilder _primaryStr = new StringBuilder();
|
|
|
|
|
_primaryStr.Append("PRIMARY KEY (");
|
|
|
|
|
for (var i = 0; i < _primarys.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
var _primary = _primarys[i];
|
|
|
|
|
_primaryStr.Append($@"`{_primary.Key}`");
|
|
|
|
|
if (i < _primarys.Length - 1)
|
|
|
|
|
{
|
|
|
|
|
_primaryStr.Append(",");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
_primaryStr.Append(")");
|
|
|
|
|
_command.AppendLine(_primaryStr.ToString());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_command.AppendLine(")");
|
|
|
|
|
if (!string.IsNullOrEmpty(table.Description))
|
|
|
|
|
{
|
|
|
|
|
_command.AppendLine(@$"COMMENT '{table.Description}'");
|
|
|
|
|
}
|
|
|
|
|
_connection.Execute(_command.ToString());
|
|
|
|
|
}
|
|
|
|
|
_connection.Close();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 删除结构
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="source">源</param>
|
|
|
|
|
/// <param name="tableKey">表</param>
|
|
|
|
|
/// <returns>是否成功</returns>
|
|
|
|
|
public bool RemoveStruct(HDP_Source source, string tableKey)
|
|
|
|
|
{
|
|
|
|
|
//数据校验
|
|
|
|
|
if (string.IsNullOrEmpty(tableKey))
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("表键无效");
|
|
|
|
|
}
|
|
|
|
|
if (!DbExistTable(source, tableKey))
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("表不存在");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using (MySqlConnection _connection = new MySqlConnection(source.GetConnectString()))
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
_connection.Open();
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException("数据源连接失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
StringBuilder _command = new StringBuilder();
|
|
|
|
|
_command.AppendLine(@$"DROP TABLE {tableKey}");
|
|
|
|
|
_connection.Execute(_command.ToString());
|
|
|
|
|
_connection.Close();
|
|
|
|
|
return !DbExistTable(source, tableKey);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 插入数据
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="source">数据源</param>
|
|
|
|
|
/// <param name="table">数据表</param>
|
|
|
|
|
/// <param name="row">数据</param>
|
|
|
|
|
/// <returns>是否成功</returns>
|
|
|
|
|
public bool Insert(HDP_Source source, HDP_Table table, Dictionary<string, object> row)
|
|
|
|
|
{
|
|
|
|
|
//数据校验
|
|
|
|
|
if (string.IsNullOrEmpty(table.Key))
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("表键无效");
|
|
|
|
|
}
|
|
|
|
|
if (table.Columns == null || table.Columns.Length == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("列无效");
|
|
|
|
|
}
|
|
|
|
|
if (row == null || row.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("数据无效");
|
|
|
|
|
}
|
|
|
|
|
using (MySqlConnection _connection = new MySqlConnection(source.GetConnectString()))
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
_connection.Open();
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException("数据源连接失败");
|
|
|
|
|
}
|
|
|
|
|
StringBuilder _command = new StringBuilder();
|
|
|
|
|
|
|
|
|
|
//主键检查
|
|
|
|
|
var _primarys = table.Columns.Where(x => x.IsPrimary == true).ToArray();
|
|
|
|
|
for (var i = 0; i < _primarys.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
var _primary = _primarys[i];
|
|
|
|
|
if (row[_primary.Key!] == null || string.IsNullOrEmpty(row[_primary.Key!].ToString()))
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException($@"主键{_primary.Key}值无效");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//插入命令
|
|
|
|
|
_command.AppendLine($@"INSERT INTO `{table.Key}` (");
|
|
|
|
|
StringBuilder _colstr = new StringBuilder();
|
|
|
|
|
StringBuilder _parmstr = new StringBuilder();
|
|
|
|
|
Dictionary<string, object> _params = new Dictionary<string, object>();
|
|
|
|
|
for (var i = 0; i < table.Columns.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
var _column = table.Columns[i];
|
|
|
|
|
if (row.ContainsKey(_column.Key!))
|
|
|
|
|
{
|
|
|
|
|
_colstr.Append($@"`{_column.Key!}`,");
|
|
|
|
|
_parmstr.Append($@"@{_column.Key},");
|
|
|
|
|
_params.Add(_column.Key!, row[_column.Key!]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (_colstr[_colstr.Length - 1] == ',')
|
|
|
|
|
{
|
|
|
|
|
_colstr.Remove(_colstr.Length - 1, 1);
|
|
|
|
|
}
|
|
|
|
|
if (_parmstr[_parmstr.Length - 1] == ',')
|
|
|
|
|
{
|
|
|
|
|
_parmstr.Remove(_parmstr.Length - 1, 1);
|
|
|
|
|
}
|
|
|
|
|
_command.AppendLine(_colstr.ToString());
|
|
|
|
|
_command.AppendLine(") VALUES (");
|
|
|
|
|
_command.AppendLine(_parmstr.ToString());
|
|
|
|
|
_command.AppendLine(")");
|
|
|
|
|
var _result = _connection.Execute(_command.ToString(), _params);
|
|
|
|
|
_connection.Close();
|
|
|
|
|
if (_result > 0)
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 更新
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="source">数据源</param>
|
|
|
|
|
/// <param name="table">数据表</param>
|
|
|
|
|
/// <param name="where">条件</param>
|
|
|
|
|
/// <param name="row">数据</param>
|
|
|
|
|
/// <returns>是否成功</returns>
|
|
|
|
|
public bool Update(HDP_Source source, HDP_Table table, Dictionary<string, string> where, Dictionary<string, object> row)
|
|
|
|
|
{
|
|
|
|
|
//数据校验
|
|
|
|
|
if (string.IsNullOrEmpty(table.Key))
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("表键无效");
|
|
|
|
|
}
|
|
|
|
|
if (table.Columns == null || table.Columns.Length == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("列无效");
|
|
|
|
|
}
|
|
|
|
|
if (where == null || where.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("条件无效");
|
|
|
|
|
}
|
|
|
|
|
if (row == null || row.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("数据无效");
|
|
|
|
|
}
|
|
|
|
|
using (MySqlConnection _connection = new MySqlConnection(source.GetConnectString()))
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
_connection.Open();
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException("数据源连接失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//更新命令
|
|
|
|
|
StringBuilder _command = new StringBuilder();
|
|
|
|
|
Dictionary<string, object> _params = new Dictionary<string, object>();
|
|
|
|
|
_command.AppendLine(@$"UPDATE `{table.Key}` SET ");
|
|
|
|
|
|
|
|
|
|
//更新列
|
|
|
|
|
StringBuilder _colstr = new StringBuilder();
|
|
|
|
|
for (var i = 0; i < table.Columns.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
var _column = table.Columns[i];
|
|
|
|
|
if (row.ContainsKey(_column.Key!) && !where.ContainsKey(_column.Key!))
|
|
|
|
|
{
|
|
|
|
|
_colstr.Append($@"`{_column.Key!}`=@{_column.Key!},");
|
|
|
|
|
_params.Add(_column.Key!, row[_column.Key!]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (_colstr[_colstr.Length - 1] == ',')
|
|
|
|
|
{
|
|
|
|
|
_colstr.Remove(_colstr.Length - 1, 1);
|
|
|
|
|
}
|
|
|
|
|
_command.AppendLine(_colstr.ToString());
|
|
|
|
|
|
|
|
|
|
//执行条件
|
|
|
|
|
StringBuilder _wherestr = new StringBuilder();
|
|
|
|
|
_wherestr.Append("WHERE 1 = 1");
|
|
|
|
|
for (var i = 0; i < table.Columns.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
var _column = table.Columns[i];
|
|
|
|
|
if (where.ContainsKey(_column.Key!))
|
|
|
|
|
{
|
|
|
|
|
switch (where[_column.Key!])
|
|
|
|
|
{
|
|
|
|
|
case HDP_WhereType.LIKE:
|
|
|
|
|
_wherestr.Append($@" AND `{_column.Key!}` {where[_column.Key!]} '%' + @{_column.Key!} + '%'");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
_wherestr.Append($@" AND `{_column.Key!}` {where[_column.Key!]} @{_column.Key!}");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
_params.Add(_column.Key!, row[_column.Key!]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
_command.AppendLine(_wherestr.ToString());
|
|
|
|
|
|
|
|
|
|
var _result = _connection.Execute(_command.ToString(), _params);
|
|
|
|
|
_connection.Close();
|
|
|
|
|
if (_result > 0)
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 删除
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="source">数据源</param>
|
|
|
|
|
/// <param name="table">数据表</param>
|
|
|
|
|
/// <param name="where">条件</param>
|
|
|
|
|
/// <param name="row">数据</param>
|
|
|
|
|
/// <returns>是否成功</returns>
|
|
|
|
|
public bool Delete(HDP_Source source, HDP_Table table, Dictionary<string, string> where, Dictionary<string, object> row)
|
|
|
|
|
{
|
|
|
|
|
//数据校验
|
|
|
|
|
if (string.IsNullOrEmpty(table.Key))
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("表键无效");
|
|
|
|
|
}
|
|
|
|
|
if (table.Columns == null || table.Columns.Length == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("列无效");
|
|
|
|
|
}
|
|
|
|
|
if (where == null || where.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("条件无效");
|
|
|
|
|
}
|
|
|
|
|
if (row == null || row.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("数据无效");
|
|
|
|
|
}
|
|
|
|
|
using (MySqlConnection _connection = new MySqlConnection(source.GetConnectString()))
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
_connection.Open();
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException("数据源连接失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//更新命令
|
|
|
|
|
StringBuilder _command = new StringBuilder();
|
|
|
|
|
Dictionary<string, object> _params = new Dictionary<string, object>();
|
|
|
|
|
_command.AppendLine(@$"DELETE FROM `{table.Key}`");
|
|
|
|
|
|
|
|
|
|
//执行条件
|
|
|
|
|
StringBuilder _wherestr = new StringBuilder();
|
|
|
|
|
_wherestr.Append("WHERE 1 = 1");
|
|
|
|
|
for (var i = 0; i < table.Columns.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
var _column = table.Columns[i];
|
|
|
|
|
if (where.ContainsKey(_column.Key!))
|
|
|
|
|
{
|
|
|
|
|
switch (where[_column.Key!])
|
|
|
|
|
{
|
|
|
|
|
case HDP_WhereType.LIKE:
|
|
|
|
|
_wherestr.Append($@" AND `{_column.Key!}` {where[_column.Key!]} '%' + @{_column.Key!} + '%'");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
_wherestr.Append($@" AND `{_column.Key!}` {where[_column.Key!]} @{_column.Key!}");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
_params.Add(_column.Key!, row[_column.Key!]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
_command.AppendLine(_wherestr.ToString());
|
|
|
|
|
|
|
|
|
|
var _result = _connection.Execute(_command.ToString(), _params);
|
|
|
|
|
_connection.Close();
|
|
|
|
|
if (_result > 0)
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 查询单个
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="source">数据源</param>
|
|
|
|
|
/// <param name="table">数据表</param>
|
|
|
|
|
/// <param name="where">条件</param>
|
|
|
|
|
/// <param name="row">数据</param>
|
|
|
|
|
/// <returns>结果</returns>
|
|
|
|
|
public T? QuerySingle<T>(HDP_Source source, HDP_Table table, Dictionary<string, string> where, Dictionary<string, object> row)
|
|
|
|
|
{
|
|
|
|
|
//数据校验
|
|
|
|
|
if (string.IsNullOrEmpty(table.Key))
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("表键无效");
|
|
|
|
|
}
|
|
|
|
|
if (table.Columns == null || table.Columns.Length == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("列无效");
|
|
|
|
|
}
|
|
|
|
|
if (where == null || where.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("条件无效");
|
|
|
|
|
}
|
|
|
|
|
if (row == null || row.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("数据无效");
|
|
|
|
|
}
|
|
|
|
|
using (MySqlConnection _connection = new MySqlConnection(source.GetConnectString()))
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
_connection.Open();
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException("数据源连接失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//查询命令
|
|
|
|
|
StringBuilder _command = new StringBuilder();
|
|
|
|
|
Dictionary<string, object> _params = new Dictionary<string, object>();
|
|
|
|
|
_command.AppendLine(@$"SELECT * FROM `{table.Key}`");
|
|
|
|
|
|
|
|
|
|
//执行条件
|
|
|
|
|
StringBuilder _wherestr = new StringBuilder();
|
|
|
|
|
_wherestr.Append("WHERE 1 = 1");
|
|
|
|
|
for (var i = 0; i < table.Columns.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
var _column = table.Columns[i];
|
|
|
|
|
if (where.ContainsKey(_column.Key!))
|
|
|
|
|
{
|
|
|
|
|
switch (where[_column.Key!])
|
|
|
|
|
{
|
|
|
|
|
case HDP_WhereType.LIKE:
|
|
|
|
|
_wherestr.Append($@" AND `{_column.Key!}` {where[_column.Key!]} '%' + @{_column.Key!} + '%'");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
_wherestr.Append($@" AND `{_column.Key!}` {where[_column.Key!]} @{_column.Key!}");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
_params.Add(_column.Key!, row[_column.Key!]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
_command.AppendLine(_wherestr.ToString());
|
|
|
|
|
|
|
|
|
|
var _result = _connection.Query<T>(_command.ToString(), _params).ToArray();
|
|
|
|
|
_connection.Close();
|
|
|
|
|
if (_result.Length > 0)
|
|
|
|
|
{
|
|
|
|
|
return _result[0];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return default(T);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 查询列表
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <typeparam name="T">返回类型</typeparam>
|
|
|
|
|
/// <param name="source">数据源</param>
|
|
|
|
|
/// <param name="table">数据表</param>
|
|
|
|
|
/// <param name="where">条件</param>
|
|
|
|
|
/// <param name="row">数据</param>
|
|
|
|
|
/// <returns>结果集</returns>
|
|
|
|
|
public T[] Query<T>(HDP_Source source, HDP_Table table, Dictionary<string, string>? where = null, Dictionary<string, object>? row = null, Dictionary<string, string>? order = null)
|
|
|
|
|
{
|
|
|
|
|
//数据校验
|
|
|
|
|
if (string.IsNullOrEmpty(table.Key))
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("表键无效");
|
|
|
|
|
}
|
|
|
|
|
if (table.Columns == null || table.Columns.Length == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("列无效");
|
|
|
|
|
}
|
|
|
|
|
using (MySqlConnection _connection = new MySqlConnection(source.GetConnectString()))
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
_connection.Open();
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException("数据源连接失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//查询命令
|
|
|
|
|
StringBuilder _command = new StringBuilder();
|
|
|
|
|
Dictionary<string, object> _params = new Dictionary<string, object>();
|
|
|
|
|
_command.AppendLine(@$"SELECT * FROM `{table.Key}`");
|
|
|
|
|
|
|
|
|
|
//执行条件
|
|
|
|
|
StringBuilder _wherestr = new StringBuilder();
|
|
|
|
|
_wherestr.Append("WHERE 1 = 1");
|
|
|
|
|
if (where != null && where.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
for (var i = 0; i < table.Columns.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
var _column = table.Columns[i];
|
|
|
|
|
if (where.ContainsKey(_column.Key!))
|
|
|
|
|
{
|
|
|
|
|
switch (where[_column.Key!])
|
|
|
|
|
{
|
|
|
|
|
case HDP_WhereType.LIKE:
|
|
|
|
|
_wherestr.Append($@" AND `{_column.Key!}` {where[_column.Key!]} '%' + @{_column.Key!} + '%'");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
_wherestr.Append($@" AND `{_column.Key!}` {where[_column.Key!]} @{_column.Key!}");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
_params.Add(_column.Key!, row[_column.Key!]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
_command.AppendLine(_wherestr.ToString());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//执行排序
|
|
|
|
|
StringBuilder _orderstr = new StringBuilder();
|
|
|
|
|
_orderstr.Append("ORDER BY ");
|
|
|
|
|
if (order != null && order.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
for (var i = 0; i < table.Columns.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
var _column = table.Columns[i];
|
|
|
|
|
if (order.ContainsKey(_column.Key!))
|
|
|
|
|
{
|
|
|
|
|
switch (order[_column.Key!])
|
|
|
|
|
{
|
|
|
|
|
case "DESC":
|
|
|
|
|
_orderstr.Append($@"`{_column.Key!}` DESC,");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
_orderstr.Append($@"`{_column.Key!}` ASC,");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (_orderstr[_orderstr.Length - 1] == ',')
|
|
|
|
|
{
|
|
|
|
|
_orderstr.Remove(_orderstr.Length - 1, 1);
|
|
|
|
|
}
|
|
|
|
|
_command.AppendLine(_orderstr.ToString());
|
|
|
|
|
}
|
|
|
|
|
var _result = _connection.Query<T>(_command.ToString(), _params);
|
|
|
|
|
_connection.Close();
|
|
|
|
|
return _result.ToArray();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 查询列表
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <typeparam name="T">返回类型</typeparam>
|
|
|
|
|
/// <param name="source">数据源</param>
|
|
|
|
|
/// <param name="table">数据表</param>
|
|
|
|
|
/// <param name="where">条件</param>
|
|
|
|
|
/// <param name="row">数据</param>
|
|
|
|
|
/// <returns>结果集</returns>
|
|
|
|
|
public HDP_Page<T> QueryPage<T>(HDP_Source source, HDP_Table table, int pageIndex, int pageSize, Dictionary<string, string>? where = null, Dictionary<string, object>? row = null, Dictionary<string, string>? order = null)
|
|
|
|
|
{
|
|
|
|
|
//数据校验
|
|
|
|
|
if (string.IsNullOrEmpty(table.Key))
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("表键无效");
|
|
|
|
|
}
|
|
|
|
|
if (table.Columns == null || table.Columns.Length == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("列无效");
|
|
|
|
|
}
|
|
|
|
|
using (MySqlConnection _connection = new MySqlConnection(source.GetConnectString()))
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
_connection.Open();
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException("数据源连接失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//查询命令
|
|
|
|
|
StringBuilder _command = new StringBuilder();
|
|
|
|
|
Dictionary<string, object> _params = new Dictionary<string, object>();
|
|
|
|
|
_command.AppendLine(@$"SELECT * FROM `{table.Key}`");
|
|
|
|
|
|
|
|
|
|
//执行条件
|
|
|
|
|
StringBuilder _wherestr = new StringBuilder();
|
|
|
|
|
_wherestr.Append("WHERE 1 = 1");
|
|
|
|
|
if (where != null && where.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
for (var i = 0; i < table.Columns.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
var _column = table.Columns[i];
|
|
|
|
|
if (where.ContainsKey(_column.Key!))
|
|
|
|
|
{
|
|
|
|
|
switch (where[_column.Key!])
|
|
|
|
|
{
|
|
|
|
|
case HDP_WhereType.LIKE:
|
|
|
|
|
_wherestr.Append($@" AND `{_column.Key!}` {where[_column.Key!]} '%' + @{_column.Key!} + '%'");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
_wherestr.Append($@" AND `{_column.Key!}` {where[_column.Key!]} @{_column.Key!}");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
_params.Add(_column.Key!, row[_column.Key!]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
_command.AppendLine(_wherestr.ToString());
|
|
|
|
|
}
|
|
|
|
|
//执行排序
|
|
|
|
|
StringBuilder _orderstr = new StringBuilder();
|
|
|
|
|
_orderstr.Append("ORDER BY ");
|
|
|
|
|
if (order != null && order.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
for (var i = 0; i < table.Columns.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
var _column = table.Columns[i];
|
|
|
|
|
if (order.ContainsKey(_column.Key!))
|
|
|
|
|
{
|
|
|
|
|
switch (order[_column.Key!])
|
|
|
|
|
{
|
|
|
|
|
case "DESC":
|
|
|
|
|
_orderstr.Append($@"`{_column.Key!}` DESC,");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
_orderstr.Append($@"`{_column.Key!}` ASC,");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (_orderstr[_orderstr.Length - 1] == ',')
|
|
|
|
|
{
|
|
|
|
|
_orderstr.Remove(_orderstr.Length - 1, 1);
|
|
|
|
|
}
|
|
|
|
|
_command.AppendLine(_orderstr.ToString());
|
|
|
|
|
}
|
|
|
|
|
var _result = new HDP_Page<T>();
|
|
|
|
|
_result.PageIndex = pageIndex;
|
|
|
|
|
_result.PageSize = pageSize;
|
|
|
|
|
StringBuilder _totalstr = new StringBuilder();
|
|
|
|
|
_totalstr.AppendLine($@"SELECT COUNT(0) FROM (");
|
|
|
|
|
_totalstr.AppendLine(_command.ToString());
|
|
|
|
|
_totalstr.AppendLine(") AS Temp");
|
|
|
|
|
_result.Total = _connection.QuerySingle<int>(_totalstr.ToString(), _params);
|
|
|
|
|
StringBuilder _pagestr = new StringBuilder();
|
|
|
|
|
_pagestr.AppendLine($@"SELECT * FROM (");
|
|
|
|
|
_pagestr.AppendLine(_command.ToString());
|
|
|
|
|
_pagestr.AppendLine(") AS Temp");
|
|
|
|
|
_pagestr.AppendLine(@$"LIMIT {(_result.PageIndex - 1) * _result.PageSize},{_result.PageSize}");
|
|
|
|
|
_result.Data = _connection.Query<T>(_pagestr.ToString(), _params).ToArray();
|
|
|
|
|
_connection.Close();
|
|
|
|
|
return _result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 判断数据源是否存在表
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="source">数据源</param>
|
|
|
|
|
/// <param name="tableName">表名</param>
|
|
|
|
|
/// <returns>是否存在</returns>
|
|
|
|
|
public bool DbExistTable(HDP_Source source, string tableName)
|
|
|
|
|
{
|
|
|
|
|
using (MySqlConnection _connection = new MySqlConnection(source.GetConnectString()))
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
_connection.Open();
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException("数据源连接失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
StringBuilder _command = new StringBuilder();
|
|
|
|
|
_command.AppendLine($@"SELECT COUNT(0) FROM INFORMATION_SCHEMA.TABLES WHERE `TABLE_TYPE`='BASE TABLE' AND `TABLE_SCHEMA`=@SourceKey AND `TABLE_NAME` =@TableKey");
|
|
|
|
|
int _result = _connection.QuerySingle<int>(_command.ToString(), new { SourceKey = source.Key, TableKey = tableName });
|
|
|
|
|
_connection.Close();
|
|
|
|
|
if (_result > 0)
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 查询数据列
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="source">数据源</param>
|
|
|
|
|
/// <param name="tableName">表名</param>
|
|
|
|
|
/// <returns>列</returns>
|
|
|
|
|
public HDP_Column[] DbGetColumns(HDP_Source source, string tableName)
|
|
|
|
|
{
|
|
|
|
|
using (MySqlConnection _connection = new MySqlConnection(source.GetConnectString()))
|
|
|
|
|
{
|
|
|
|
|
var _result = new List<HDP_Column>();
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
_connection.Open();
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException("数据源连接失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
StringBuilder _command = new StringBuilder();
|
|
|
|
|
_command.AppendLine($@"SELECT `COLUMN_NAME` AS `Key`,`DATA_TYPE` AS `DataType`,`COLUMN_COMMENT` AS `Description` FROM INFORMATION_SCHEMA.COLUMNS
|
|
|
|
|
WHERE `TABLE_SCHEMA`=@SourceKey AND `TABLE_NAME`=@TableKey");
|
|
|
|
|
_result.AddRange(_connection.Query<HDP_Column>(_command.ToString(), new { SourceKey = source.Key, TableKey = tableName }));
|
|
|
|
|
_connection.Close();
|
|
|
|
|
return _result.ToArray();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|