C# 从数据库填充Resource.resx文件
我试图在启动时从数据库填充资源文件。每次加载页面时,都应该检查活动语言。我目前一直在解决如何插入资源文件的问题。我尝试了显而易见的方法,但没有成功C# 从数据库填充Resource.resx文件,c#,asp.net,C#,Asp.net,我试图在启动时从数据库填充资源文件。每次加载页面时,都应该检查活动语言。我目前一直在解决如何插入资源文件的问题。我尝试了显而易见的方法,但没有成功 ResourceFile = TempTransMessage; 知道怎么做吗?您可以使用Microsoft的文本模板转换工具包(通常称为“T4”)从数据库中存储的数据生成resx文件。Scott Hanselman已经发表了一篇关于这个主题的文章,这将给你一个很好的了解这是如何工作的 .tt文件的一个示例就是这样做的: <#@ templ
ResourceFile = TempTransMessage;
知道怎么做吗?您可以使用Microsoft的文本模板转换工具包(通常称为“T4”)从数据库中存储的数据生成resx文件。Scott Hanselman已经发表了一篇关于这个主题的文章,这将给你一个很好的了解这是如何工作的 .tt文件的一个示例就是这样做的:
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="System.Configuration" #>
<#@ assembly name="System.Web" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.Web.Configuration" #>
<#@ import namespace="System.Web" #>
<#@ output extension=".resx" #>
<#
SqlConnection _Connection;
SqlCommand _Command;
_Connection = new SqlConnection();
/// Open the connection to the database
_Connection.ConnectionString = "Initial Catalog=YourCatalog;Integrated Security=true;Data Source=YourDatasource";
// Open the connection
_Connection.Open();
_Command = _Connection.CreateCommand();
_Command.CommandType = CommandType.Text;
_Command.CommandText = "select Id,Value from MyTable";
SqlDataReader reader = _Command.ExecuteReader();
#>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<#
while(reader.Read())
{#>
<data name="<#= reader["Id"]#>" xml:space="preserve">
<value><#= HttpUtility.HtmlEncode(reader["Value"].ToString()) #></value>
</data>
<#
}
#>
</root>
<#
reader.Close();
reader.Dispose();
/// Close the SqlDataReader if exist and close the connection to the database
_Connection.Close();
_Connection.Dispose();
#>
text/microsoft resx
2
System.Resources.ResXResourceReader,System.Windows.Forms,版本=4.0.0.0,区域性=neutral,PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter,System.Windows.Forms,版本=4.0.0.0,区域性=neutral,PublicKeyToken=b77a5c561934e089
除非您需要重新分发这些资源文件(在这种情况下,Diego的答案是一个非常好的选择),否则您可能还需要查看如何直接从数据库检索资源。使用提供程序,您可以让自定义提供程序直接签出数据库
事实上,Rick Strahl已经这样做了,如果您需要的话我的ListObject中有数据库中的所有文件,但我只想执行Resource.add,还有其他方法吗?看看:ResXResourceWriter类ASP.NET命名空间中没有ResXResourceWriter:(将System.Windows.Forms.dll添加到引用列表中。将“using System.Resources”添加到aspx.cs文件的顶部。然后,您将能够创建ResXResourceWriter类的实例。