我有一个处理数据库列元数据的类。类的一个属性是有问题的表。这是通过构造函数传递给对象的。同样在构造函数中,我应用一些逻辑来分配类中的其他变量。为此,有许多私有方法连接到数据库,查询有关表的内容,并将值返回给变量。
我的问题是我有很多不同的方法做同样的事情,但返回不同的数据类型。所以例如我的代码是这样的
public Column(string tableName)
{
strTableName = tableName;
pkColumnName = GetPKColumnName(tableName);
pkColumnLenght = GetPKColumnLenght(tableName);
}
private string GetPKColumnName(string tableName)
{
string query = String.Format("SELECT myColName FROM myTable where myTableName = {0}", tableName);
string result = "";
try
{
using(SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString))
{
con.Open();
using (SqlCommand command = new SqlCommand(query, con))
{
result = (string)command.ExecuteScalar();
}
}
}
catch (SqlException ex)
{
Console.WriteLine(ex.Message);
}
return result;
}
private int GetPKColumnLenght(string tableName)
{
string query = String.Format("SELECT myColLenght FROM myTable where myTableName = {0}", tableName);
int result = 0;
try
{
using(SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString))
{
con.Open();
using (SqlCommand command = new SqlCommand(query, con))
{
result = (int)command.ExecuteScalar();
}
}
}
catch (SqlException ex)
{
Console.WriteLine(ex.Message);
}
return result;
}
还有许多其他类似的方法。这对我来说看起来不太好,所以我想知道这样的事情的最佳做法是什么。
我应该将返回类型声明为对象,并在将返回值赋给变量时执行数据类型转换吗?
答案 0 :(得分:1)
我的回答和另一个假设不同的问题。在我看来,您正在尝试从特定列查询单个值,并且您必须创建新方法,因为类型不同。也就是说,我个人只是使用一个简单的ORM解决方案而另一个答案肯定没有错,只是另一个抽象。
您将需要使用泛型并强制转换为泛型。
我没有测试过这段代码,它更像是一个指南。
private T GetValue<T>(string tableName, colName)
{
string query = String.Format("SELECT {0} FROM myTable where myTableName = {1}", colName, tableName);
T result = default(T);
try
{
using(SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString))
{
con.Open();
using (SqlCommand command = new SqlCommand(query, con))
{
result = (T)command.ExecuteScalar();
}
}
}
catch (SqlException ex)
{
Console.WriteLine(ex.Message);
}
return result;
}
答案 1 :(得分:0)
创建SqlManager
类
public class SqlManager
{
public static string ConnectionString
{
get
{
return "Your ConnectionString"
}
}
public static SqlConnection GetSqlConnection(SqlCommand cmd)
{
if (cmd.Connection == null)
{
SqlConnection conn = new SqlConnection(ConnectionString);
conn.Open();
cmd.Connection = conn;
return conn;
}
return cmd.Connection;
}
public static object ExecuteScalar(SqlCommand cmd)
{
SqlConnection conn = GetSqlConnection(cmd);
try
{
return cmd.ExecuteScalar();
}
catch
{
throw;
}
finally
{
conn.Close();
}
}
}
现在你的方法,第二个相同的事情:
private string GetPKColumnName(string tableName)
{
string query = String.Format("", tableName);
SqlCommand cmd = new SqlCommand();
cmd.CommandText = @"SELECT myColName FROM myTable where myTableName = @TableName";
cmd.Parameters.AddWithValue("@TableName", tableName);
object result = SqlManager.ExecuteScalar(cmd);
return result != null ? (int)object: 0;
}