C#实体框架查询存储过程错误“不支持文化”

时间:2018-11-13 09:20:03

标签: c# entity-framework

我正在尝试从包含一些韩国文字的数据库中查询数据。其他没有朝鲜信息的数据库也可以使用。我应该设置一些文化信息吗?我发现的数据库排序规则是 Korean_Wansung_Unicode_CI_AS

using (DBModel data = new DBModel())
{
  //command and parameters prepared here  
  var SqlCommand = "ProcedureName @LastUpdateDate, @LastUpdateTS";
   var SqlParams = new SqlParameter[]
   {
     new SqlParameter { ParameterName = "@LastUpdateDate",  Value =lastDatetime, Direction = System.Data.ParameterDirection.Input },
     new SqlParameter { ParameterName = "@LastUpdateTS",  Value =lastTS, Direction = System.Data.ParameterDirection.Input }
    };
  return data.Database.SqlQuery<BP>(SqlCommand, SqlParams).ToList();
}

Database.SqlQuery 引发 CultureNotFoundException 如下

  

不支持文化。

     

参数名称:区域性

     

66578(0x10412)是无效的区域性标识符。

at System.Globalization.CultureInfo.GetCultureInfo(Int32 culture)
   at System.Globalization.CompareInfo.GetCompareInfo(Int32 culture)
   at System.Data.ProviderBase.FieldNameLookup.LinearIndexOf(String fieldName, CompareOptions compareOptions)
   at System.Data.ProviderBase.FieldNameLookup.IndexOf(String fieldName)
   at System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName)
   at System.Data.SqlClient.SqlDataReader.GetOrdinal(String name)
   at System.Data.Entity.Core.Query.InternalTrees.ColumnMapFactory.TryGetColumnOrdinalFromReader(DbDataReader storeDataReader, String columnName, Int32& ordinal)
   at System.Data.Entity.Core.Query.InternalTrees.ColumnMapFactory.CreateColumnMapFromReaderAndClrType(DbDataReader reader, Type type, MetadataWorkspace workspace)
   at System.Data.Entity.Core.Objects.ObjectContext.InternalTranslate[TElement](DbDataReader reader, String entitySetName, MergeOption mergeOption, Boolean streaming, EntitySet& entitySet, TypeUsage& edmType)
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryInternal[TElement](String commandText, String entitySetName, ExecutionOptions executionOptions, Object[] parameters)
   at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass69`1.<ExecuteStoreQueryReliably>b__68()
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
   at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass69`1.<ExecuteStoreQueryReliably>b__67()
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryReliably[TElement](String commandText, String entitySetName, ExecutionOptions executionOptions, Object[] parameters)
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQuery[TElement](String commandText, ExecutionOptions executionOptions, Object[] parameters)
   at System.Data.Entity.Internal.InternalContext.<>c__DisplayClass14`1.<ExecuteSqlQuery>b__13()
   at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)

我尝试使用普通的旧方法将数据检索到数据表中,但工作正常。那么需要在EF中设置什么?

            var SqlCommand = "exec ProcedureName '2018-11-11 16:30:00', 163000";                   

            string constring = System.Configuration.ConfigurationManager.ConnectionStrings["Connection"].ToString();
            SqlConnection con = new System.Data.SqlClient.SqlConnection(constring);
            SqlCommand cmd = new SqlCommand(SqlCommand, con);
            cmd.CommandType = System.Data.CommandType.Text;
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            da.Fill(dt);

1 个答案:

答案 0 :(得分:0)

此处的LCID 出现,将在TDS解析器中进行设置-特别是TdsParser.TryProcessEnvChange;这意味着您无法通过C#代码进行任何更改。

我只能提供两个建议:

  1. 尝试在要查询的计算机上安装相关的朝鲜语语言包;可能是因为它现在无法解决这种文化,但是将语言包安装到Windows可以帮助它理解-未经测试
  2. 查看是否可以更改数据库排序规则;现在显然,这是一个具有巨大影响的巨大更改,因此不应轻描淡写-理想情况下,只有在所有其他方法都失败之后

当然,第三个选择可能是查看EF或SqlClient人员(重叠团队)是否在github上响应。他们在dotnet / corefx下。公开的github主要是“ .NET Core”,因此一个很好的起点是确认同样的问题在.NET Core上发生。如果是这样,与人交往会容易得多。

免责声明:这里的一切都是从入侵到调用树,我不要声称对此具有权威性。