如何将C#字符串转换为varchar PostgreSQL?

时间:2014-01-29 11:39:03

标签: c# sql postgresql

我有类型不匹配的问题 - 我想。我有与数据库连接的应用程序并发送查询。这就是它的工作原理:

string wartosc1 = "'letters'";

NpgsqlCommand command9 = new NpgsqlCommand("SELECT * FROM RESOURCES WHERE TYPE = "+wartosc1, conn);

但是当我尝试执行它时,有答案:

System.FormatException: Input string was not in correct format.

我认为变量类型存在问题,因为我只输入:

SELECT * FROM RESOURCES WHERE TYPE ='letters'

一切都好。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

您需要使用参数将值传递给查询。

阅读http://msdn.microsoft.com/en-us/library/yy6y35y8(v=vs.110).aspx了解如何操作。

var wartosc1 = "letters";

var command9 = new NpgsqlCommand("SELECT * FROM RESOURCES WHERE TYPE = @type", conn);
command9.Parameters.Add("@type", wartosc1);

答案 1 :(得分:2)

因为你写的时候;

"SELECT * FROM RESOURCES WHERE TYPE = " + wartosc1

你的命令就像;

SELECT * FROM RESOURCES WHERE TYPE = letters

这是错误的,因为我认为您的TYPE列是某种 text 类型。如果您轻松解决此问题,可以在单引号中添加wartosc1变量;

"SELECT * FROM RESOURCES WHERE TYPE = '" + wartosc1 + "'"

但请不要这样使用。

您应该始终在命令中使用parameterized queries。它可以防止,忘记使用一些引号,逗号等。但更重要的是,这种字符串连接可用于SQL Injection攻击。

string wartosc1 = "letters";
NpgsqlCommand command9 = new NpgsqlCommand("SELECT * FROM RESOURCES WHERE TYPE = @type", conn);
command9.Parameters.AddWithValue("@type", wartosc1);

答案 2 :(得分:0)

这是一个使用多个变量和一个日期的字符串插值示例:

var dt = DateTime.Now.AddDays(-30);
string wartosc1 = "letters";
string myStatement = $@"
    SELECT *
    FROM RESOURCES res
    WHERE res.DATE_EXAMPLE >= '{dt}' 
    AND res.TYPE = '{wartosc1}'
  "

注意只需设置

,此sql字符串即可进行sql注入
wartosc1 = "somevalue' AND someOtherStatement 'thenDoSomethingBeforeApostrophe";

但是,可能您的环境不需要担心...在一个int周围不需要加撇号,但是在日期时间前后忘记它,会引发错误。