TableAdapter和Unicode?

TableAdapter和Unicode?,unicode,utf-8,internationalization,globalization,tableadapter,Unicode,Utf 8,Internationalization,Globalization,Tableadapter,与Microsoft Visual Studio 2010 Professional协作,使用C语言,与Microsoft SQL Server 2008协作 我的任务是获取一个现有的应用程序,并进行更改,以便它可以在文本框中接收多种语言,而无需提前配置要使用的语言 为了确保正确执行此操作,我在数据库中创建了一个名为Language的新表。如果我能用[语言]让事情正常运转,我应该能让一切正常运转。所涉及的字段是MotherTongueLanguageName: 我用以下内容预加载表: TRUNC

与Microsoft Visual Studio 2010 Professional协作,使用C语言,与Microsoft SQL Server 2008协作

我的任务是获取一个现有的应用程序,并进行更改,以便它可以在文本框中接收多种语言,而无需提前配置要使用的语言

为了确保正确执行此操作,我在数据库中创建了一个名为Language的新表。如果我能用[语言]让事情正常运转,我应该能让一切正常运转。所涉及的字段是MotherTongueLanguageName:

我用以下内容预加载表:

TRUNCATE TABLE [dbo].[Language]
SET NOCOUNT ON
INSERT INTO [Language] VALUES ('English','English') -- 1
INSERT INTO [Language] VALUES ('French','Français') -- 2
INSERT INTO [Language] VALUES ('Spanish','Español') -- 3
SET NOCOUNT OFF
GO
在我的网页上,一切看起来都很完美。当我试图从网页上输入俄语和葡萄牙语时,它会用???????以母语命名。如果可能的话,我希望能够在不设置特定区域性或uiCulture的情况下做到这一点

我已经编辑了MasterPage.master文件,并已将添加到,并接受charset=utf-8到标记

我甚至添加了内容类型:text/html;将charset=utf-8转换为IIS中的自定义HTTP头,我希望这实际上不是必需的

网页确实使用TableAdapter将网格和输入字段连接到数据库,我想知道其中是否有任何东西将我的Unicode文本恢复为ASCII

任何帮助都将不胜感激。我刚从猜测中走出来,谷歌在我一直使用的搜索词上帮了我很多忙

-新信息-

我的所有网页->数据库链接都存储在名为DBDataSet.xsd的文件中。当我右键单击此表单中的空白区域时,我可以选择Add->TableAdapter。。。当我这样做时,我会得到一个向导,引导我选择数据连接,然后选择我选择的命令类型使用现有存储过程,然后将命令绑定到现有存储过程。我选择select、Insert、Update和Delete存储过程,每个存储过程都接受相应列的VarChar和NVarChar数据作为参数。然后选择要生成的方法,并选择填充数据表和返回数据表

所有这些都是自动发生的,并且在幕后生成了一系列代码。在搜索DBDataSet.Designer.cs文件以查找对MotherTongueLanguageName的引用时,我没有看到任何代码将其与其他只是varchar的列区分开来。例如:

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
    private void InitClass() {
        this.columnLanguageName = new global::System.Data.DataColumn("LanguageName", typeof(string), null, global::System.Data.MappingType.Element);
        base.Columns.Add(this.columnLanguageName);
        this.columnLanguageID = new global::System.Data.DataColumn("LanguageID", typeof(byte), null, global::System.Data.MappingType.Element);
        base.Columns.Add(this.columnLanguageID);
        this.columnLanguageAbbrev = new global::System.Data.DataColumn("LanguageAbbrev", typeof(string), null, global::System.Data.MappingType.Element);
        base.Columns.Add(this.columnLanguageAbbrev);
        this.columnMotherTongueLanguageName = new global::System.Data.DataColumn("MotherTongueLanguageName", typeof(string), null, global::System.Data.MappingType.Element);
        base.Columns.Add(this.columnMotherTongueLanguageName);
        this.columnLanguageColour = new global::System.Data.DataColumn("LanguageColour", typeof(string), null, global::System.Data.MappingType.Element);
        base.Columns.Add(this.columnLanguageColour);
        this.Constraints.Add(new global::System.Data.UniqueConstraint("Constraint1", new global::System.Data.DataColumn[] {
                        this.columnLanguageID}, true));
        this.columnLanguageName.AllowDBNull = false;
        this.columnLanguageName.MaxLength = 30;
        this.columnLanguageID.AllowDBNull = false;
        this.columnLanguageID.ReadOnly = true;
        this.columnLanguageID.Unique = true;
        this.columnLanguageAbbrev.AllowDBNull = false;
        this.columnLanguageAbbrev.MaxLength = 3;
        this.columnMotherTongueLanguageName.AllowDBNull = false;
        this.columnMotherTongueLanguageName.MaxLength = 30;
        this.columnLanguageColour.MaxLength = 10;
    }
LanguageName和MotherTongueLanguageName都使用typeofstring,即使其中一个是VarChar,另一个是NVarChar。这是正确的吗

此外:

生成的代码不应该引用global::System.Data.SqlDbType.NVarChar而不是global::System.Data.SqlDbType.VarChar吗?如果我直接对生成的代码进行这些更改,那么只要我刷新DBDataSet.xsd文件,这些更改就会消失


这是一个现有的项目,所以我需要继续使用从数据库中获取数据并将其放入数据库的方式。我需要做什么才能通过TableAdapter将数据从网页正确地传输到数据库?

找到了我想要的答案

问题是我不清楚是否需要使用数据集设计器将新的Unicode列从DataType:ansisting更改为DataType:String。一旦我这样做,设计器就会将ProviderType从VarChar更改为NVarChar。我曾认为,如果您从头开始创建一个新的TableAdapter,那么它应该认识到该列是一个NVarChar,并自动执行此操作。现在我意识到我只需要多做一步


另外,由于我们使用一个单独的TableAdapter来存储所有非CRUD存储过程,我需要对其执行相同的操作,以确保传递的数据保持Unicode。

数据库使用哪种排序规则?SQL\u Latin1\u General\u CP1\u CI\u因为我觉得这只会影响排序,但我尝试将我的水晶文本添加到脚本中,得到了相同的结果。在中,它说:SQL排序规则控件:用于在Microsoft®SQL Server中存储非Unicode数据的代码页™. SQL Server如何对Unicode和非Unicode数据类型中存储的字符进行排序和比较的规则。如果您对SQL Server 6.5版或SQL Server 7.0版的现有实例使用复制功能,则选择SQL排序规则。您的应用程序代码取决于以前SQL Server排序规则的行为。看起来我需要一个排序规则,但我不想要一个……您需要添加接受表单输入的代码并将其存储在数据库中。实际上,它看起来可能是SQL Server的东西。我尝试通过SQLSMS 2012直接添加unicode文本,结果成功了。我尝试在SQL SMS 2012的查询窗口中通过插入脚本添加它,但没有。是否有其他论坛可以将此问题发布到?
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
    private void InitClass() {
        this.columnLanguageName = new global::System.Data.DataColumn("LanguageName", typeof(string), null, global::System.Data.MappingType.Element);
        base.Columns.Add(this.columnLanguageName);
        this.columnLanguageID = new global::System.Data.DataColumn("LanguageID", typeof(byte), null, global::System.Data.MappingType.Element);
        base.Columns.Add(this.columnLanguageID);
        this.columnLanguageAbbrev = new global::System.Data.DataColumn("LanguageAbbrev", typeof(string), null, global::System.Data.MappingType.Element);
        base.Columns.Add(this.columnLanguageAbbrev);
        this.columnMotherTongueLanguageName = new global::System.Data.DataColumn("MotherTongueLanguageName", typeof(string), null, global::System.Data.MappingType.Element);
        base.Columns.Add(this.columnMotherTongueLanguageName);
        this.columnLanguageColour = new global::System.Data.DataColumn("LanguageColour", typeof(string), null, global::System.Data.MappingType.Element);
        base.Columns.Add(this.columnLanguageColour);
        this.Constraints.Add(new global::System.Data.UniqueConstraint("Constraint1", new global::System.Data.DataColumn[] {
                        this.columnLanguageID}, true));
        this.columnLanguageName.AllowDBNull = false;
        this.columnLanguageName.MaxLength = 30;
        this.columnLanguageID.AllowDBNull = false;
        this.columnLanguageID.ReadOnly = true;
        this.columnLanguageID.Unique = true;
        this.columnLanguageAbbrev.AllowDBNull = false;
        this.columnLanguageAbbrev.MaxLength = 3;
        this.columnMotherTongueLanguageName.AllowDBNull = false;
        this.columnMotherTongueLanguageName.MaxLength = 30;
        this.columnLanguageColour.MaxLength = 10;
    }
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
    private void InitAdapter() {
        this._adapter = new global::System.Data.SqlClient.SqlDataAdapter();
        global::System.Data.Common.DataTableMapping tableMapping = new global::System.Data.Common.DataTableMapping();
        tableMapping.SourceTable = "Table";
        tableMapping.DataSetTable = "GetLanguages";
        tableMapping.ColumnMappings.Add("LanguageName", "LanguageName");
        tableMapping.ColumnMappings.Add("LanguageID", "LanguageID");
        tableMapping.ColumnMappings.Add("LanguageAbbrev", "LanguageAbbrev");
        tableMapping.ColumnMappings.Add("MotherTongueLanguageName", "MotherTongueLanguageName");
        tableMapping.ColumnMappings.Add("LanguageColour", "LanguageColour");
        this._adapter.TableMappings.Add(tableMapping);
        this._adapter.DeleteCommand = new global::System.Data.SqlClient.SqlCommand();
        this._adapter.DeleteCommand.Connection = this.Connection;
        this._adapter.DeleteCommand.CommandText = "dbo.DeleteLanguage";
        this._adapter.DeleteCommand.CommandType = global::System.Data.CommandType.StoredProcedure;
        this._adapter.DeleteCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@RETURN_VALUE", global::System.Data.SqlDbType.Int, 4, global::System.Data.ParameterDirection.ReturnValue, 10, 0, null, global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
        this._adapter.DeleteCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@LanguageID", global::System.Data.SqlDbType.Int, 4, global::System.Data.ParameterDirection.Input, 10, 0, "LanguageID", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
        this._adapter.InsertCommand = new global::System.Data.SqlClient.SqlCommand();
        this._adapter.InsertCommand.Connection = this.Connection;
        this._adapter.InsertCommand.CommandText = "dbo.AddLanguage";
        this._adapter.InsertCommand.CommandType = global::System.Data.CommandType.StoredProcedure;
        this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@RETURN_VALUE", global::System.Data.SqlDbType.Int, 4, global::System.Data.ParameterDirection.ReturnValue, 10, 0, null, global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
        this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@LanguageName", global::System.Data.SqlDbType.VarChar, 30, global::System.Data.ParameterDirection.Input, 0, 0, "LanguageName", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
        this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@LanguageAbbrev", global::System.Data.SqlDbType.VarChar, 30, global::System.Data.ParameterDirection.Input, 0, 0, "LanguageAbbrev", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
        this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@MotherTongueLanguageName", global::System.Data.SqlDbType.VarChar, 30, global::System.Data.ParameterDirection.Input, 0, 0, "MotherTongueLanguageName", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
        this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@LanguageColour", global::System.Data.SqlDbType.VarChar, 10, global::System.Data.ParameterDirection.Input, 0, 0, "LanguageColour", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
        this._adapter.UpdateCommand = new global::System.Data.SqlClient.SqlCommand();
        this._adapter.UpdateCommand.Connection = this.Connection;
        this._adapter.UpdateCommand.CommandText = "dbo.EditLanguage";
        this._adapter.UpdateCommand.CommandType = global::System.Data.CommandType.StoredProcedure;
        this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@RETURN_VALUE", global::System.Data.SqlDbType.Int, 4, global::System.Data.ParameterDirection.ReturnValue, 10, 0, null, global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
        this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@OldLanguageID", global::System.Data.SqlDbType.Int, 4, global::System.Data.ParameterDirection.Input, 10, 0, "LanguageID", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
        this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@OldLanguageName", global::System.Data.SqlDbType.VarChar, 30, global::System.Data.ParameterDirection.Input, 0, 0, "LanguageName", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
        this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@OldLanguageAbbrev", global::System.Data.SqlDbType.VarChar, 30, global::System.Data.ParameterDirection.Input, 0, 0, "LanguageAbbrev", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
        this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@OldMotherTongueLanguageName", global::System.Data.SqlDbType.VarChar, 30, global::System.Data.ParameterDirection.Input, 0, 0, "MotherTongueLanguageName", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
        this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@OldLanguageColour", global::System.Data.SqlDbType.VarChar, 10, global::System.Data.ParameterDirection.Input, 0, 0, "LanguageColour", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
        this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@NewLanguageName", global::System.Data.SqlDbType.VarChar, 30, global::System.Data.ParameterDirection.Input, 0, 0, "LanguageName", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
        this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@NewLanguageAbbrev", global::System.Data.SqlDbType.VarChar, 30, global::System.Data.ParameterDirection.Input, 0, 0, "LanguageAbbrev", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
        this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@NewMotherTongueLanguageName", global::System.Data.SqlDbType.VarChar, 30, global::System.Data.ParameterDirection.Input, 0, 0, "MotherTongueLanguageName", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
        this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@NewLanguageColour", global::System.Data.SqlDbType.VarChar, 10, global::System.Data.ParameterDirection.Input, 0, 0, "LanguageColour", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
    }