带有使用“子字符串”字的 SQL 请求的 C# .Net OleDbCommand 不适用于 DB2/400 数据库

C# .Net OleDbCommand with SQL request using "substring" word not working with DB2/400 database

提问人:Jchristophe Cherid 提问时间:11/2/2023 最后编辑:dbcJchristophe Cherid 更新时间:11/3/2023 访问量:61

问:

我正在研究使用 DB2/400 数据库 (IBMi ) 的 Rest API。

我正在使用这个字符串连接到数据库:

//  Defaut connexion string           
ConnectString = "Provider=IBMDA400;" + "Password=xxxxxxx;" +"User ID=Bxxxxxxxx;" +"Data Source=XXX.XX.XX.XX;";

与系统的连接工作正常:

ConnectLst = new OleDbConnection(ConnectString);
try
{
    ConnectLst = new OleDbConnection(ConnectString);

    ConnectLst.Open();

    ResCnx = true;
}
catch (Exception ex)
{
    ResCnx = false;
}

finally
{ }

return ResCnx;

我的问题是带有子字符串的简单SQL请求不起作用:

string W_RqtSql = "SELECT SUBSTRING(CDMATN,2,3) " +                
                 " FROM " + @_Schema + ".CSALAR CSAL " +                     
                 " where CSAL.NOPPHN = '" + @_NumPers + "'";

我有以下错误消息:

  • $exception {"SQL0104: Syntactic element ,2 is not correct. Possible elements: , FROM.\r\nCause . . . . .: A syntax error was detected at element ,2. , 2 is not a valid element. , FROM is a partial list of valid elements.

我也试过,但也不起作用。SUBSTR

没有“substring”字的相同 SQL 请求效果很好:

string W_RqtSql = "SELECT CDMATN " +                
                 " FROM " + @_Schema + ".CSALAR CSAL " +                     
                 " where CSAL.NOPPHN = '" + @_NumPers + "'";

如何选择列值的子字符串?

C# SQL .NET DB2-400 OLEDB命令

评论

2赞 dbc 11/2/2023
这不是对您的问题的回答,而是警告:您的代码容易受到 SQL 注入攻击。不应在查询字符串中嵌入参数值,而应始终构造参数化查询。请参阅:参数化查询如何帮助防止 SQL 注入?和为什么我们总是喜欢在 SQL 语句中使用参数?
0赞 dbc 11/2/2023
也不是答案,但是从数据库获取值后,有什么理由不能在 C# 端执行子字符串吗?例如,数据库中的字符串是否非常长,因此您想在将它们发送到 REST 代码之前提取子字符串?
2赞 dbc 11/2/2023
我完全不知道 DB2/400,但 DB2 for IBM i (AS400) 查询 substr 将子字符串函数名称显示为 substr not 。IBM 的这个文档页面还显示了 .所以你可以试一试。SUBSTRINGSUBSTR
1赞 Jchristophe Cherid 11/2/2023
是的,你是对的:我将针对 sql 注入调整我的代码。我需要在 SQL 命令中使用子字符串,因为在最终的 SQL 请求中,我必须使用子字符串返回的值发出子请求。
1赞 nfgl 11/3/2023
尝试在逗号和数字之间使用空格,如下所示:SUBSTRING(CDMATN, 2, 3)

答:

0赞 Jchristophe Cherid 11/3/2023 #1

解决方案是:

逗号和数字之间有空格的语法,如下所示:SUBSTRING(CDMATN, 2, 3)

非常感谢您的帮助:)