首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TableAdapter和Unicode?

TableAdapter和Unicode?
EN

Stack Overflow用户
提问于 2014-06-03 19:15:02
回答 1查看 1.1K关注 0票数 0

使用MicrosoftVisualStudio2010Professional,使用C#,使用Microsoft 2008。

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

为了确保我的操作正确,我在数据库中创建了一个名为Language的新表。如果我能用语言把事情做好,我应该能让它全部发挥作用。所讨论的领域是MotherTongueLanguageName

代码语言:javascript
复制
CREATE TABLE [Language](
[LanguageID] [tinyint] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
[LanguageName] [varchar](30) NOT NULL,
[MotherTongueLanguageName] [nvarchar](30) NOT NULL)

我预先加载了表中的内容:

代码语言:javascript
复制
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

在我的网页上,一切看起来都很完美。当我尝试从网页中输入俄语和русский时,它会在MotherTongueLanguageName中使用???????访问数据库。如果可能的话,我希望能够在不设置特定区域性或uiCulture的情况下做到这一点。

我已经编辑了我的MasterPage.master文件,并将<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />添加到<head>中,将accept-charset="utf-8"添加到<form>标记中。

我甚至在IIS中将Content-Type: text/html; charset=utf-8添加到自定义HTTP头中,我希望这并不是必要的。

该网页确实使用TableAdapter将网格和条目字段连接到数据库,我想知道其中是否有任何内容正在将我的Unicode文本还原回ASCII。

任何帮助都将不胜感激。我刚刚从猜测中解脱出来,谷歌在我一直在使用的搜索词方面已经尽力帮助了我。

-新信息--

我所有的网页->数据库链接都存储在一个名为DBDataSet.xsd的文件中。当我右键单击此表单中的一个空白区域时,我可以选择添加-> TableAdapter.当我这样做时,我得到了一个向导,它带我穿过Choose Your Data Connection,然后是Choose a Command Type (我选择Use existing stored procedures),然后是Bind Commands to Existing Stored Procedures。我选择“选择”、“插入”、“更新”和“删除”,它们每个都接受适当列的VarChar和NVarChar数据作为参数。然后它带我到Choose Methods to Generate,我选择了Fill a DataTableReturn a DataTable

所有这些都是自动发生的,一堆代码是在幕后生成的.当我在DBDataSet.Designer.cs文件中搜索对MotherTongueLanguageName的引用时,我没有看到任何代码将其与仅为VarChars的其他列区分开来。例如:

代码语言:javascript
复制
[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;
    }

LanguageNameMotherTongueLanguageName都使用typeof(string),尽管其中一个是VarChar,另一个是NVarChar。这是正确的吗?

另外:

代码语言:javascript
复制
    [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, "", "", ""));
    }

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-12 20:15:12

找到了我在DaniWeb寻找的答案。

问题是,不清楚是否需要使用DataSet设计器将新的Unicode列从DataType:AnsiString (默认)更改为DataType:String。一旦我这样做,设计人员就会将ProviderTypeVarChar更改为NVarChar。我曾经想过,如果您从零开始创建一个新的TableAdapter,那么它应该认识到该列是一个NVarChar,并自动地这样做。现在我意识到我只需要做这个额外的步骤。

另外,由于我们使用一个单独的TableAdapter来存储所有非CRUD存储过程,我需要这样做,确保正在传递的数据保持Unicode。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24023175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档