6.1Класс MySQL Статический класс MySQL является самой важной частью приложения. Именно он определяет параметры для подключения к базе данных, само подключение и доступ к данным.
using System;
using System.Data;
using System.Data.Odbc;
using System.Collections.Generic;
namespace winOrders
{
static class MySQL
{
public static string Driver { get; set; }
public static string Server { get; set; }
public static int Port { get; set; }
public static string User { get; set; }
public static string Pass { get; set; }
public static string Database { get; set; }
public static OdbcConnection Connection { get; set; }
public static Link CurrentUser { get; set; } public static string ConnectionString()
{// Формирование строки подключения к БД
return "DRIVER=" + Driver + ";"
+ "SERVER=" + Server + ";"
+ "PORT=" + Port.ToString() + ";"
+ "USER=" + User + ";"
+ "PASSWORD=" + Pass + ";"
+ "DATABASE=" + Database + ";"
+ "stmt=SET NAMES 'cp1251';OPTION=4;";
} public static OdbcConnection GetConnection()
{// Формирование подключения к БД
return new OdbcConnection(ConnectionString());
} public static DataTable TableStructure(this string TableName)
{ // Возвращает таблицу структуры таблицы базы данных по имени таблицы
// простите за тавтологию :)
var dt = new DataTable();
string SQLstring =
@"SELECT
i.COLUMN_COMMENT as Synonym,
i.COLUMN_NAME as Name,
i.DATA_TYPE as Type,
i.CHARACTER_MAXIMUM_LENGTH as Length,
i.COLUMN_KEY as _Key,
k.REFERENCED_TABLE_NAME as rTab,
k.REFERENCED_COLUMN_NAME as rCol
FROM information_schema.COLUMNS as i
LEFT JOIN information_schema.KEY_COLUMN_USAGE as k ON
i.TABLE_SCHEMA = k.TABLE_SCHEMA AND
i.TABLE_NAME = k.TABLE_NAME AND
i.COLUMN_NAME = k.COLUMN_NAME
WHERE i.TABLE_SCHEMA = '" + Database + "' and i.TABLE_NAME = '" + TableName + "'";
dt.Fill(SQLstring);
return dt;
} public static string GetSynonym(this string TableName)
{// Определяет пользовательское представление таблицы БД по имени таблицы
string SQLstring =
@"SELECT LEFT(TABLE_COMMENT,LOCATE(';', TABLE_COMMENT)-1)
FROM information_schema.`TABLES`
where TABLE_SCHEMA = '"+Database+"' and TABLE_NAME = '"+TableName+"'";
string resultString = GetCommand(SQLstring).ExecuteScalar().ToString();
return resultString == "" ? TableName : resultString;
} public static string GetSynonym(this string TableName, string ColumnName)
{// Определяет пользовательское представление колонки таблицы БД
string SQLstring =
"SELECT COLUMN_COMMENT FROM information_schema.`COLUMNS`"+
"where TABLE_SCHEMA = '"+ Database+"'"
+" and TABLE_NAME = '"+ TableName+"'"
+" and COLUMN_NAME = '"+ ColumnName+"'";
string resultString = GetCommand(SQLstring).ExecuteScalar().ToString();
return resultString == "" ? ColumnName : resultString;
} public static string GetSynonym(this DataRow row)
{// Находит пользовательское представление клонки в строке таблицы структуры БД
return row.GetCol("Synonym") == "" ? row.GetName() : row.GetCol("Synonym");
} public static OdbcType GetOdbcType(string TypeName)
{// Определение типа данных по имени типа
switch (TypeName)
{
case "int": return OdbcType.Int;
case "varchar": return OdbcType.VarChar;
case "tinyint": return OdbcType.TinyInt;
case "date": return OdbcType.Date;
case "datetime": return OdbcType.DateTime; default: return OdbcType.VarChar;
}
} public static OdbcType GetOdbcType(this DataRow row)
{// Получение значения типа данных из строки таблицы структуры БД
return GetOdbcType(row.GetCol("Type"));
} public static int GetLenght(this DataRow row)
{// Получение длины значения для колонки из строки талицы структуры БД
return row.GetCol("Length") == "" ? 1 : int.Parse(row.GetCol("Length"));
} public static string GetName(this DataRow row)
{// получение поля "Name"
// необходимо часто, поэтому выделено в отдельный метод
return row.GetCol("Name");
} public static string GetCol(this DataRow row, string ColName)
{// Получение колонки таблицы по имени с проверкой существования колонки
if (row.Table.Columns.Contains(ColName))
return row[ColName].ToString();
else throw new Exception("Нет колонки "+ColName+"!");
} public static bool GetBoolCol(this DataRow row, string ColName)
{// Конвертация tinyint в bool
return row.GetCol(ColName) == "1" ? true : false;
} public static int GetLastId()
{// Получение последнего автоматически сгенерированного идентификатора
return int.Parse(GetCommand("SELECT LAST_INSERT_ID()").ExecuteScalar().ToString());
} public static int GetId(this DataRow row)
{// Получение поля "id"
string id = row.GetCol("id").ToString();
return id=="" ? 0 : int.Parse(id);
} public static OdbcParameter GetParameter(this DataRow row)
{// Формирование параметра к запросу
return new OdbcParameter("@" + row.GetName(), row.GetOdbcType(), row.GetLenght(), row.GetName());
} public static OdbcDataAdapter GetAdapter(string SQLstring)
{// Получение дата-адаптера
return new OdbcDataAdapter(SQLstring, Connection);
}
public static void Fill(this DataTable table, string SQLstring)
{// заполнение таблицы данными на основе строки SQL запроса
table.Clear();
GetAdapter(SQLstring).Fill(table);
} public static OdbcCommand GetCommand(string SQLstring)
{// Получение объекта OdbcCommand
return new OdbcCommand(SQLstring, Connection);
} public static bool TestConnection()
{// Проверка соединения с БД
bool result = true;
try
{
Connection.Open();
}
catch (Exception)
{
result = false;
}
return result;
} public static List<Link> ToLinksList(this DataTable dt)
{// Формирование списка ссылок из таблицы
return new List<Link>(dt.AsEnumerable()
.Select(r => new Link(dt.TableName, r.GetId(), r.GetName())));
} public static List<Link> GetLinkCollection(string tableName)
{// Получение списка ссылок для выпадающих списков
DataTable dt = new DataTable(tableName);
dt.Fill("SELECT id, Name FROM "+tableName);
return dt.ToLinksList();
} public static string ToMySQL(this DateTime date)
{// Конвертация даты в строку формата MySQL
return "'" + string.Format("{0:yyyy-MM-dd HH:mm:ss}", date) + "'";
}
}
}
|
|