Added tablechooser and SqlBuilder class
This commit is contained in:
84
SqlBuilder.cs
Normal file
84
SqlBuilder.cs
Normal file
@@ -0,0 +1,84 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Text;
|
||||
|
||||
namespace DbTools {
|
||||
public class SqlBuilder {
|
||||
|
||||
public string[] GetTableNames(IDbConnection cn) {
|
||||
if (cn == null) {
|
||||
throw new ArgumentNullException("cn");
|
||||
}
|
||||
List<string> tables = new List<string>();
|
||||
if (cn.State != ConnectionState.Open) {
|
||||
cn.Open();
|
||||
}
|
||||
using (IDbCommand cmd = cn.CreateCommand()) {
|
||||
cmd.CommandText = "SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name;";
|
||||
using (IDataReader reader = cmd.ExecuteReader()) {
|
||||
while (reader.Read()) {
|
||||
tables.Add(reader.GetString(0));
|
||||
}
|
||||
}
|
||||
}
|
||||
return tables.ToArray();
|
||||
}
|
||||
|
||||
public string GetTableCreateSql(IDbConnection cn, string tableName, string selectStatement = "select * from $table") {
|
||||
if (cn == null) {
|
||||
throw new ArgumentNullException("cn");
|
||||
}
|
||||
if (string.IsNullOrEmpty(tableName)) {
|
||||
throw new ArgumentNullException("tableName");
|
||||
}
|
||||
|
||||
if (cn.State != ConnectionState.Open) {
|
||||
cn.Open();
|
||||
}
|
||||
selectStatement = selectStatement.Replace("$table", tableName);
|
||||
using (IDbCommand cmd = cn.CreateCommand()) {
|
||||
cmd.CommandText = selectStatement;
|
||||
using (IDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly | CommandBehavior.KeyInfo)) {
|
||||
DataTable schemaTable = reader.GetSchemaTable();
|
||||
if (schemaTable == null) {
|
||||
throw new Exception("Could not get schema for table " + tableName);
|
||||
}
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.AppendLine("CREATE TABLE " + tableName + " (");
|
||||
List<string> pkColumns = new List<string>();
|
||||
foreach (DataRow row in schemaTable.Rows) {
|
||||
string columnName = row["ColumnName"].ToString();
|
||||
string dataType = row["DataTypeName"].ToString();
|
||||
int columnSize = Convert.ToInt32(row["ColumnSize"]);
|
||||
bool allowDBNull = Convert.ToBoolean(row["AllowDBNull"]);
|
||||
bool isKey = Convert.ToBoolean(row["IsKey"]);
|
||||
if (isKey) {
|
||||
pkColumns.Add(columnName);
|
||||
}
|
||||
sb.Append(" " + columnName + " " + dataType);
|
||||
if (dataType.Equals("VARCHAR", StringComparison.OrdinalIgnoreCase) ||
|
||||
dataType.Equals("CHAR", StringComparison.OrdinalIgnoreCase) ||
|
||||
dataType.Equals("NVARCHAR", StringComparison.OrdinalIgnoreCase) ||
|
||||
dataType.Equals("NCHAR", StringComparison.OrdinalIgnoreCase)) {
|
||||
sb.Append("(" + columnSize + ")");
|
||||
}
|
||||
if (!allowDBNull) {
|
||||
sb.Append(" NOT NULL");
|
||||
}
|
||||
sb.AppendLine(",");
|
||||
}
|
||||
if (pkColumns.Count > 0) {
|
||||
sb.AppendLine(" PRIMARY KEY (" + string.Join(", ", pkColumns) + ")");
|
||||
} else {
|
||||
// Remove the last comma
|
||||
sb.Length -= 3;
|
||||
sb.AppendLine();
|
||||
}
|
||||
sb.AppendLine(");");
|
||||
return sb.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user