使用MicrosoftVisualStudio2010Professional,使用C#,使用Microsoft 2008。
我的任务是接受一个现有的应用程序,并进行更改,以便它可以在文本框中接收多种语言,而无需提前配置要使用的语言。
为了确保我的操作正确,我在数据库中创建了一个名为Language的新表。如果我能用语言把事情做好,我应该能让它全部发挥作用。所讨论的领域是MotherTongueLanguageName
CREATE TABLE [Language](
[LanguageID] [tinyint] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
[LanguageName] [varchar](30) NOT NULL,
[MotherTongueLanguageName] [nvarchar](30) NOT NULL)我预先加载了表中的内容:
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 DataTable和Return a DataTable。
所有这些都是自动发生的,一堆代码是在幕后生成的.当我在DBDataSet.Designer.cs文件中搜索对MotherTongueLanguageName的引用时,我没有看到任何代码将其与仅为VarChars的其他列区分开来。例如:
[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都使用typeof(string),尽管其中一个是VarChar,另一个是NVarChar。这是正确的吗?
另外:
[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 )获取到数据库,我需要做什么?
发布于 2014-06-12 20:15:12
找到了我在DaniWeb寻找的答案。
问题是,不清楚是否需要使用DataSet设计器将新的Unicode列从DataType:AnsiString (默认)更改为DataType:String。一旦我这样做,设计人员就会将ProviderType从VarChar更改为NVarChar。我曾经想过,如果您从零开始创建一个新的TableAdapter,那么它应该认识到该列是一个NVarChar,并自动地这样做。现在我意识到我只需要做这个额外的步骤。
另外,由于我们使用一个单独的TableAdapter来存储所有非CRUD存储过程,我需要这样做,确保正在传递的数据保持Unicode。
https://stackoverflow.com/questions/24023175
复制相似问题