CLR存储过程与C#抛出错误

时间:2012-11-18 07:57:44

标签: c# sql-server clr sqlclr

您好我正在使用C#制作CLR存储过程,我正在通过示例学习。

以下是我现在正在尝试的内容

public static void GetProductsByPrice(int price)
{
    SqlConnection connection = new SqlConnection("context connection=true");
    connection.Open();

    string commandText = "SELECT * FROM Products WHERE PRICE < " + price.ToString();

    SqlCommand command = new SqlCommand(commandText, connection);
    SqlDataReader reader = command.ExecuteReader();

    // Create the record and specify the metadata for the columns.
    SqlDataRecord record = new SqlDataRecord(
        new SqlMetaData("col1", SqlDbType.NVarChar, 100),
        new SqlMetaData("col2", SqlDbType.NVarChar, 100));

    // Mark the begining of the result-set.
    SqlContext.Pipe.SendResultsStart(record);

    // Send 10 rows back to the client. 
    while (reader.Read())
    {
        // Set values for each column in the row.
        record.SetString(0, reader[1].ToString()); //productName
        record.SetString(1, reader[2].ToString()); // productDescription
        // Send the row back to the client.
        SqlContext.Pipe.SendResultsRow(record);
    }

    // Mark the end of the result-set.
    SqlContext.Pipe.SendResultsEnd();
}

但是当我尝试运行它时,我得到以下错误

  

Msg 6549,Level 16,State 1,Procedure GetProductsByPrice,Line 0
  执行用户定义的例程或聚合'GetProductsByPrice'时发生.NET Framework错误:
  System.Data.SqlClient.SqlException:SQL Server不支持区域设置标识符(LCID)16393。
  System.Data.SqlClient.SqlException:
  在Microsoft.SqlServer.Server.SmiEventSink_Default.DispatchMessages(Boolean ignoreNonFatalMessages)
  在Microsoft.SqlServer.Server.SqlPipe.SendResultsStart(SqlDataRecord记录)
  在StoredProcedures.GetProductsByPrice(Int32价格)
  用户交易(如果有)将被回滚。

我指代代码msdn article

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:5)

异常说明:The locale identifier (LCID) 16393 is not supported by SQL

SqlMetaData.LocaleId属性包含列或参数的区域设置ID,其中默认值是当前线程的当前区域设置。

您的案例16393中的默认值English - India区域设置(see table)但您的SQL服务器似乎安装了不同的区域设置English - United States

所以你有三个选择:

  1. 配置/重新安装SQL Server以使用区域设置English - India
  2. 将当前线程的区域设置更改为SQL Server支持的本地
  3. 创建SqlMetaData时手动指定区域设置:

     SqlDataRecord record = new SqlDataRecord(
      new SqlMetaData("col1", SqlDbType.NVarChar, 1033, SqlCompareOptions.None),
      new SqlMetaData("col2", SqlDbType.NVarChar, 1033, SqlCompareOptions.None));
    

    1033是English - United States

  4. 的区域设置ID