2

こんにちは私は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();
}

しかし、実行しようとすると、以下のエラーが発生します

メッセージ6549、レベル16、状態1、プロシージャGetProductsByPrice、行0
ユーザー定義ルーチンまたは集計の実行中に.NET Frameworkエラーが発生しました'GetProductsByPrice':
System.Data.SqlClient.SqlException:ロケール識別子(LCID)16393はサポートされていませんSQLServerによる。
System.Data.SqlClient.SqlException:
Microsoft.SqlServer.Server.SmiEventSink_Default.DispatchMessages(Boolean ignoreNonFatalMessages)
at Microsoft.SqlServer.Server.SqlPipe.SendResultsStart(SqlDataRecord record)
at StoredProcedures.GetProductsByPrice(Int32 price)
ユーザートランザクション(存在する場合)ロールバックされます。

コードについては、このmsdnの記事を参照しています。

これについて私を助けてください。

4

1 に答える 1

5

例外は次のように述べています。The locale identifier (LCID) 16393 is not supported by SQL

SqlMetaData.LocaleIdプロパティには、列またはパラメーターのロケール ID が含まれます。既定値は、現在のスレッドの現在のロケールです。

この場合のデフォルト値16393English - Indiaロケールです(表を参照)が、SQLサーバーが別のロケールでインストールされたようですEnglish - United States

したがって、次の 3 つのオプションがあります。

  1. ロケールを使用するように SQL サーバーを構成/再インストールするEnglish - India
  2. 現在のスレッドのロケールを、SQL サーバーでサポートされているローカルに変更します
  3. を作成するときにロケールを手動で指定しますSqlMetaData

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

    1033 はロケール ID ですEnglish - United States

于 2012-11-18T08:34:04.157 に答える