我正在写一个代码生成和我被陷在确定一个存储过程的结果集列的可空状态的存储过程结果的列可以为空。我可以查询的数据类型就好了,但无论是DataReader对象,也不是数据表列包含我的专栏的正确空值。我怎样才能确定是否
public List<DataColumn> GetColumnInfoFromStoredProcResult(string schema, string storedProcName)
{
//build sql text
var sb = new StringBuilder();
sb.Append("SET FMTONLY OFF; SET FMTONLY ON; \n");//this is how EF4.1 did so I copied..not sure why the repeat
sb.Append(String.Format("exec {0}.{1} ", schema, storedProcName));
var prms = GetStoredProcedureParameters(schema: schema, sprocName: storedProcName);
var count = 1;
foreach (var param in prms)
{
sb.Append(String.Format("{0}=null", param.Name));
if (count < prms.Count)
{
sb.Append(", ");
}
count++;
}
sb.Append("\n SET FMTONLY OFF; SET FMTONLY OFF;");
var dataTable = new DataTable();
//var list = new List<DataColumn>();
using (var sqlConnection = this.SqlConnection)
{
using (var sqlAdapter = new SqlDataAdapter(sb.ToString(), sqlConnection))
{
if (sqlConnection.State != ConnectionState.Open) sqlConnection.Open();
sqlAdapter.SelectCommand.ExecuteReader(CommandBehavior.KeyInfo);
sqlConnection.Close();
sqlAdapter.Fill(dataTable);
}
//using (var sqlCommand = new SqlCommand())
//{
// sqlCommand.CommandText = sb.ToString();
// sqlCommand.CommandType = CommandType.Text;
// sqlCommand.Connection = sqlConnection;
// if (sqlConnection.State != ConnectionState.Open) sqlConnection.Open();
// var dr = sqlCommand.ExecuteReader(CommandBehavior.SchemaOnly);
// var whateva = dr.GetSchemaTable();
// foreach (DataColumn col in whateva.Columns)
// {
// list.Add(col);
// }
//}
}
var list = dataTable.Columns.Cast<DataColumn>().ToList();
return list;
}
我试图从一个存储过程类似于在实体框架创建一个复杂类型的东西结束。我可以劫持该功能吗?
在这个例子中,ID列.. tblJobId(不是我个人的称呼)将不能为空。但我选择null作为ImNull,它具有所有的相同属性那么,如何EF确定相应的C#数据类型应可以为空还是不可以?
有没有人做过这个..
想法是赞赏。
*我试图从一个存储过程类似于在实体框架创建一个复杂类型的东西结束。我可以劫持该功能吗? - 是的,使用实体框架。 – 2012-01-31 05:25:13
此代码生成器为企业数据访问块创建存储过程调用。我使用Linq到EDMX来为实体生成中间层和自动导入sprocs。好东西,但我只是想确定列是否为空或不那么我可以创建存储过程的结果属性和对象的一部分。 EF竟然是我的表计太慢了,我厌倦了等待的“向导”,甚至更新整个EDMX时,我只更新一个存储过程。 – TheDev6 2012-01-31 05:34:03
您可以依靠标准的SMO呼叫。我用'StoredProcedureParameter.DefaultValue'参数取得了一些成功。 – 2012-01-31 05:41:05