Files
VAR.DatabaseExplorer/VAR.DatabaseExplorer/Code/DataAccess/ColumnDA.cs
2018-10-24 21:28:27 +02:00

79 lines
3.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using VAR.DatabaseExplorer.Code.DataTransfer;
namespace VAR.DatabaseExplorer.Code.DataAccess
{
public class ColumnDA
{
public static List<Column> GetColumns(string conexionString, string tableSchema, string tableName)
{
var columns = new List<Column>();
var cnx = new SqlConnection(conexionString);
// Preparar comando y parametros
var da = new SqlDataAdapter(@"
SELECT col.COLUMN_NAME AS ColumnName,
col.DATA_TYPE AS Type,
col.CHARACTER_MAXIMUM_LENGTH AS Size,
c.CONSTRAINT_TYPE AS KeyType,
col.IS_NULLABLE AS Nullable
FROM INFORMATION_SCHEMA.COLUMNS AS col
LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS k
ON col.COLUMN_NAME=k.COLUMN_NAME AND
col.TABLE_NAME=k.TABLE_NAME AND
col.TABLE_SCHEMA=k.TABLE_SCHEMA
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS c
ON k.CONSTRAINT_NAME=c.CONSTRAINT_NAME
WHERE col.TABLE_NAME=@TableName AND
col.TABLE_SCHEMA=@TableSchema
ORDER BY col.ORDINAL_POSITION
", cnx);
var prm = new SqlParameter("@TableName", SqlDbType.VarChar, 100) { Value = tableName };
da.SelectCommand.Parameters.Add(prm);
prm = new SqlParameter("@TableSchema", SqlDbType.VarChar, 100) { Value = tableSchema };
da.SelectCommand.Parameters.Add(prm);
// Obtener datatable con las columnas
var dt = new DataTable();
cnx.Open();
da.Fill(dt);
cnx.Close();
// Recorrer datatable estableciendo la lista de columnas
foreach (DataRow dr in dt.Rows)
{
string columnName = Convert.ToString(dr["ColumnName"]);
Column col = columns.FirstOrDefault(c => c.Name == columnName);
if (col == null)
{
col = new Column();
columns.Add(col);
}
col.Name = columnName;
col.Type = Convert.ToString(dr["Type"]);
if ((dr["Size"] is DBNull) == false)
{
col.Size = Convert.ToInt32(dr["Size"]);
}
string strNullable = (Convert.ToString(dr["Nullable"])).ToLower();
col.Nullable = (strNullable == "yes") || (strNullable == "1") || (strNullable == "true");
string KeyType = Convert.ToString(dr["KeyType"]).ToLower();
if (KeyType.Contains("primary"))
{
col.PK = true;
}
}
return columns;
}
}
}