0

我正在尝试使用 SQL 数据库构建具有更改控件的动态网页。由于我还需要表和 div,因此我无法插入每个控件的 sql,因为它不会在 SQL 表上加起来。基本上我试图复制整个 html 并将其放在一行中,但这似乎不起作用,我无法将其作为纯文本输出。也许对此有一些建议?

我正在查看任何对象 SQL,因此我可以将整个表单作为字节或任何其他方式插入。C# 上是否有任何用于 OSQL 的库?(我想做这个服务器端)或者关于如何正确执行此操作的任何提示?

我试图将 HTML 代码插入 SQL 以供将来使用,但这给了我错误

    StringWriter sw = new StringWriter();
    HtmlTextWriter w = new HtmlTextWriter(sw);
    Form1.RenderControl(w);
    string s = sw.GetStringBuilder().ToString();
 string command = "INSERT INTO `htmltables`(`Company`, `Type`, `HTML`) VALUES  ('TestCompany','TestType','" + s + "')";

无论如何,我真的想插入对象而不是纯 HTML,因为这将简化我将来的工作。

先感谢您。

4

3 回答 3

0

序列化您的类并将 xml 对象放入数据库中,这是一个序列化类和函数的示例,用于与对象/xml 进行序列化:

VB.net

Imports System.Runtime.Serialization
Imports System.Xml
Imports System.IO
Imports System.Text

Namespace NamespaceGoesHere
    <DataContract()> _
    Public Class ClassNameGoesHere
        'All your properties go here, for example:
        <DataMember> Property PropertyName As String = "test"
        'Note the use of <DataMember> and <DataContract()>

        #Region "Serialisation"
            Public Function Serialise() As String
                Dim s As New System.IO.MemoryStream
                Dim x As New DataContractSerializer(GetType(ClassNameGoesHere))

                x.WriteObject(s, Me)
                s.Position = 0

                Dim sw As New StreamReader(s)
                Dim str As String

                str = sw.ReadToEnd()

                Return str
            End Function

            Public Shared Function DeSerialise(xmlDocument As String) As ClassNameGoesHere
                Dim doc As New XmlDocument
                Dim ser As New DataContractSerializer(GetType(ClassNameGoesHere))

                Dim stringWriter As New StringWriter()
                Dim xmlWriter As New XmlTextWriter(stringWriter)

                doc.LoadXml(xmlDocument)
                doc.WriteTo(xmlWriter)

                Dim stream As New MemoryStream(Encoding.UTF8.GetBytes(stringWriter.ToString()))
                stream.Position = 0
                Dim reader As XmlDictionaryReader = XmlDictionaryReader.CreateTextReader(stream, New XmlDictionaryReaderQuotas())

                Return DirectCast(ser.ReadObject(reader, True), ClassNameGoesHere)
            End Function
        #End Region
    End Class
End Namespace

C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Runtime.Serialization;
using System.Xml;
using System.IO;
using System.Text;

namespace NamespaceGoesHere
{
    [DataContract()]
    public class ClassNameGoesHere
    {
        //All your properties go here, for example:
        [DataMember()]
        public string PropertyName { get; set; }
        //Note the use of [DataMember()] and [DataContract()]

        #region "Serialisation"
        public string Serialise()
        {
            System.IO.MemoryStream s = new System.IO.MemoryStream();
            DataContractSerializer x = new DataContractSerializer(typeof(ClassNameGoesHere));

            x.WriteObject(s, this);
            s.Position = 0;

            StreamReader sw = new StreamReader(s);
            string str = null;

            str = sw.ReadToEnd();

            return str;
        }

        public static ClassNameGoesHere DeSerialise(string xmlDocument)
        {
            XmlDocument doc = new XmlDocument();
            DataContractSerializer ser = new DataContractSerializer(typeof(ClassNameGoesHere));

            StringWriter stringWriter = new StringWriter();
            XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter);

            doc.LoadXml(xmlDocument);
            doc.WriteTo(xmlWriter);

            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(stringWriter.ToString()));
            stream.Position = 0;
            XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(stream, new XmlDictionaryReaderQuotas());

            return (ClassNameGoesHere)ser.ReadObject(reader, true);
        }
        #endregion
    }
}

创建类后,您可以使用 serialise 函数将其序列化为 xml 字符串。将其存储在数据库中(我将使用 XML 数据类型,但您可以将其存储为 NVARCHAR(MAX)。从数据库返回时,只需调用传入字符串的反序列化函数,您将再次获取对象。

于 2013-10-10T13:22:06.450 回答
0

您的 html 文本可能包含不适合 Sql 的字符。最安全的方法是使用参数。

例如:

        string connectionString = "";
        string html = "<div id=\'loremIpsum\'><div/>";

        using (SqlCommand command = new SqlConnection(connectionString).CreateCommand())
        {
            command.CommandText = "insert into YourTable (YourColumn) values(@yourParameter)";
            command.Parameters.Add(new SqlParameter("yourParameter", html));
            try
            {
                command.Connection.Open();
                command.ExecuteNonQuery();
            }
            finally
            {
                command.Connection.Close();
            }
        }
于 2013-10-10T11:34:36.377 回答
0

尝试修复您的查询:

"INSERT INTO `htmltables`(`Company`, `Type`, `HTML`) VALUES 
('TestCompany','TestType','" + s + "')"
  1. 尝试从字符串中删除字符。

    "INSERT INTO htmltables(Company, Type, HTML) VALUES ('TestCompany','TestType','" + s + "')"

  2. 并尝试使用参数,例如:

    "INSERT INTO htmltables(Company, Type, HTML) VALUES (@0,@1,@2)", "The Company", "TestType", s

并进行查询。

对我来说只有这个错误。

将 div 添加到数据库中

这不是问题,问题可能是服务器不允许这样的角色认为他们可能是潜在的。为此,您可以尝试以下操作:

Request.Unvalidated["name"];

这样,服务器将获得div插入的或任何其他 HTML 标记。

基本上我试图复制整个 html 并将其放在一行中,但这似乎不起作用,我无法将其作为纯文本输出。

当您使用我建议的术语时,它应该可以工作,但是等等,您说它似乎不起作用,那么您如何获得文本?除非有一些数据,否则不会提供任何内容。你的问题有点令人困惑。非常遗憾。

参考:

http://technet.microsoft.com/en-us/library/aa214012(v=sql.80).aspx

MSDN 将是您在这个问题上最好的伙伴!:)

于 2013-10-10T11:23:26.727 回答