Sql server 插入包含撇号的值时出错

Sql server 插入包含撇号的值时出错,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我对SQL Server 2008中的text数据类型非常陌生 我创建了一个表: CREATE TABLE sample(id int identity,name varchar(20),Yell_Your_self text) 但我面临着插入的问题 insert into sample values('ganesh','welcome to india') insert into sample values('ganesh','welcome to india's largest temp

我对SQL Server 2008中的
text
数据类型非常陌生

我创建了一个表:

CREATE TABLE sample(id int identity,name varchar(20),Yell_Your_self text) 
但我面临着插入的问题

insert into sample values('ganesh','welcome to india')
insert into sample values('ganesh','welcome to india's largest temple')
第一条语句工作正常,但如何执行第二条语句?

试试这一条-

IF OBJECT_ID(N'dbo.sample') IS NOT NULL
   DROP TABLE dbo.[sample]

CREATE TABLE dbo.[sample]
(
      id INT IDENTITY(1,1) PRIMARY KEY
    , name VARCHAR(20)
    , Yell_Your_self VARCHAR(2000)
)

INSERT INTO dbo.[sample] 
VALUES
    ('ganesh', 'welcome to india'), 
    ('ganesh', 'welcome to india''s largest temple')
更新3:

public int get(string val1,string val2) 
{ 
    using(SqlConnection con = new SqlConnection(connectionString))
    {
        con.Open();

        int i = 0;

        using (SqlCommand cmd = new SqlCommand("INSERT INTO dbo.sample (name, Yell_Your_self) VALUES(@val1, @val2)", con))
        {
            cmd.Parameters.AddWithValue("@val1", val1);
            cmd.Parameters.AddWithValue("@val2", val2);
            i = cmd.ExecuteNonQuery();
        }

        con.Close();
        return i;
    }
}
试试这个-

IF OBJECT_ID(N'dbo.sample') IS NOT NULL
   DROP TABLE dbo.[sample]

CREATE TABLE dbo.[sample]
(
      id INT IDENTITY(1,1) PRIMARY KEY
    , name VARCHAR(20)
    , Yell_Your_self VARCHAR(2000)
)

INSERT INTO dbo.[sample] 
VALUES
    ('ganesh', 'welcome to india'), 
    ('ganesh', 'welcome to india''s largest temple')
更新3:

public int get(string val1,string val2) 
{ 
    using(SqlConnection con = new SqlConnection(connectionString))
    {
        con.Open();

        int i = 0;

        using (SqlCommand cmd = new SqlCommand("INSERT INTO dbo.sample (name, Yell_Your_self) VALUES(@val1, @val2)", con))
        {
            cmd.Parameters.AddWithValue("@val1", val1);
            cmd.Parameters.AddWithValue("@val2", val2);
            i = cmd.ExecuteNonQuery();
        }

        con.Close();
        return i;
    }
}

可能在印度字母表中的撇号上出现错误

insert into sample values('ganesh','welcome to india''s largest temple')

可能在印度字母表中的撇号上出现错误

insert into sample values('ganesh','welcome to india''s largest temple')

问题是字符串中有一个单引号,而单引号是SQL中的字符串分隔符

尝试:


问题是字符串中有一个单引号,而单引号是SQL中的字符串分隔符

尝试:


正如您已经意识到的那样,SQL面临的问题是在查询中避免撇号,我想这已经解决了。要回答关于如何从前端传递值(如C#)的第二个问题,参数化查询是一种很好的方法。作为一种替代方法,您也可以使用此方法,该方法涉及字符串操作以准备查询:

public int get(string val1,string val2) 
{ 
    string temp = string.Concat(val1,"," + val2); // concatenate all your params
    temp = temp.replace("'","''").replace(",","','");  // replace any single qoute with escaped single quote
    string s="insert into sample values('" + temp +  "')"; // append altered string in query
    SqlCommand cmd = new SqlCommand(s,con); 
    con.Open(); 
    int i = cmd.ExecuteNonQuery(); 
    con.Close(); 
    return i; 
}

希望有帮助

您已经知道,SQL面临的问题是在查询中避免撇号,我想这已经解决了。要回答关于如何从前端传递值(如C#)的第二个问题,参数化查询是一种很好的方法。作为一种替代方法,您也可以使用此方法,该方法涉及字符串操作以准备查询:

public int get(string val1,string val2) 
{ 
    string temp = string.Concat(val1,"," + val2); // concatenate all your params
    temp = temp.replace("'","''").replace(",","','");  // replace any single qoute with escaped single quote
    string s="insert into sample values('" + temp +  "')"; // append altered string in query
    SqlCommand cmd = new SqlCommand(s,con); 
    con.Open(); 
    int i = cmd.ExecuteNonQuery(); 
    con.Close(); 
    return i; 
}

希望有帮助

尝试传递动态值

insert into sample values(@name, N''' + @Yell_Your_self text + ''' )

通过传递动态值来尝试此操作

insert into sample values(@name, N''' + @Yell_Your_self text + ''' )


非常感谢jasonpublic int get(string val1,string val2){string s=“插入样本值(“+val1+”,“+val2+”);“SqlCommand cmd=new SqlCommand(s,con);con.Open();int i=cmd.ExecuteNonQuery();con.Close();return i;}尝试使用字符串添加数组中的所有参数。替换(“'”,“''”),然后用逗号连接所有值,使其为val1,val2,。。。。然后将其传递给Sql。@谢谢您的评论。我完全同意你的看法。非常感谢你jasonpublic int get(string val1,string val2){string s=“插入样本值(“+val1+”,“+val2+”);“SqlCommand cmd=new SqlCommand(s,con);con.Open();int I=cmd.ExecuteNonQuery();con.Close();return i;}尝试使用字符串添加数组中的所有参数。替换(“'”,“''”),然后用逗号连接所有值,使其为val1,val2,。。。。然后将其传递给Sql。@谢谢您的评论。我完全同意你的看法。这在sql server中运行良好,但我希望使用ado.net从frient端传递值,如c#.net。这在sql server中运行良好,但我希望使用ado.netpublic int post(string val1,string val2)从frient端传递值,如c#.net{string s=“插入示例值(“+val1+”,“+val2+”)”;SqlCommand cmd=new SqlCommand(s,con);con.Open();int i=cmd.ExecuteNonQuery();con.Close();return i;}(2)永远不要以这种方式从C#传递SQL语句中的变量。这正是创建SQL注入漏洞的方式,永远不应该这样做。相反,使用SqlParameter类传递SQL变量。它将防止SQL注入漏洞,还将处理引起问题的必要的引号转义(除了替换引号外,您可能还需要做其他20件转义操作)。public int post(string val1,string val2){string s=“插入示例值(“+val1+”,“+val2+”)”;SqlCommand cmd=new SqlCommand(s,con);con.Open();int i=cmd.ExecuteNonQuery();con.Close();return i;}(2)永远不要以这种方式从C#传递SQL语句中的变量。这正是创建SQL注入漏洞的方式,永远不应该这样做。相反,使用SqlParameter类传递SQL变量。它将防止SQL注入漏洞,还将处理导致您出现问题的必要引号转义(除了替换引号外,您可能还需要执行20项其他转义操作)。如果您遇到错误,请在问题中输入错误消息如果这是特定于从C#调用的,请在问题中说明,并包括您试图执行的C#代码。除所有其他响应外,请注意
text
,您不应再使用它;改用
(n)varchar(max)
。@Pondlife-根据表格定义,他们正在使用
varchar(20)
(尽管在问题文本中提到了
text
)@MartinSmith很好的理解,我把这个和OP并排看,他明确地说“是数据类型
text
”,虽然这些描述显然不可靠。如果您遇到错误,请将错误消息放在问题中如果这是特定于从C#调用的,请在问题中说明,并包括您尝试执行的C#代码。除了所有其他响应,请注意
文本
,您不应再使用它;改用
(n)varchar(max)
。@Pondlife-根据表格定义,他们正在使用
varchar(20)
(尽管在问题文本中提到了
text
)@MartinSmith很好的理解,我把这个和OP并排看,他明确地说“是数据类型
text
”,虽然这些描述显然不可靠。