查询中的 OpenEdge/Progress DB 参数

问题描述

我正在尝试编写一个小型的 c# 应用程序来连接到 ProgressDB,但我在很早的阶段就失败了......编写一个带有参数的查询。就上下文而言,直到上周我什至没有取得进展(我是一个主流的 MSsql 猴子)

如果我在 Tsql 中编写查询,那就是

DECLARE @Id nvarchar(15) = 'X1234'
SELECT * from People WHERE Id = @Id

现在我可以使用 ODBC 查询工具为进度编写硬编码的选择语句

Select * from People where "Id" = 'X1234'

但我不知道如何对其进行参数化,我已经查看了 Progress/OpenEdge KB,但它似乎不像 X = "Y" 调用 X 那样简单。

我可以在我的 C# 代码中做一些非常混乱的事情(额外的好处是让我的高级开发人员哭泣)并执行以下操作:

string sqlstr = "Select * from People where " + "\"" + "Id" + "\" ' = " + id + "'";

但我真的很想做这样的事情。显然这是使用 sqlConnection 而不是 OdbcConnection 但这是明天我要解决的问题(明天我不太喜欢昨天的我)

public async Task<IEnumerable<Data>>GetMeMyData(string id)
        {
            using (var connection = new sqlConnection(_configuration.GetConnectionString("MyDB")))
            {
                var sqlQuery = "Select * from People where \"ID\" = '@Id'";

                return await connection.QueryAsync<Data>(sqlQuery,new { Id = id });
            }
        }

任何有关 eli5/babies 第一个进度查询的建议或链接都​​将不胜感激 谢谢(希望一切都有意义)。

解决方法

谷歌site:progress.com sql parameterized query

第一个命中 P176215 包含一个示例,我只是在这里复制/粘贴。

以下示例 C# 程序显示了如何针对 ODBC 连接构建参数化查询:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.Odbc;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            OdbcConnection conn = new OdbcConnection("DSN=S2K;UID=abc;PWD=def;");
            OdbcCommand cmd = conn.CreateCommand();

            conn.Open();

            cmd.CommandText = "SELECT CustNum,Name FROM PUB.Customer WHERE CustNum > ? AND Balance > ?";

            cmd.Parameters.Add("@Num",OdbcType.Int);
            cmd.Parameters.Add("@Bal",OdbcType.Int);

            cmd.Parameters["@Num"].Value = 2;
            cmd.Parameters["@Bal"].Value = 500;

            OdbcDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                Console.WriteLine("CustNum and Name: {0} {1}",reader.GetValue(0),reader.GetValue(1));
            }

            reader.Close();

            conn.Close();

            Console.ReadLine();
        }
    }
}

我觉得这一切都很合理。

我唯一担心的是您正在使用直接数据库访问,我永远不会给您 - 但您的情况我提供了这一点。

我会将我需要的数据公开为受控制的安全 REST API,然后可以由 C# 或您想要使用的任何其他客户端语言使用。

,

回到这个问题并使用 Dapper 来实现所需的两个选项都有效,我只是想与现有代码保持一致。

using (var connection = new OdbcConnection(_configuration.GetConnectionString("LocalClient")))
            {
                 var FilesSqlQuery = 
                    "Select \"CUSTOMER-ID\" as CId," +
                    "\"CUSTOMER-NAME\" as CName," +
                    " \"CUSTOMER-TYPE\" as CType," +
                    " \"DATE-ADDED\" as DateAdded" +
                    "FROM PUB.People" +
                    " WHERE \"ID\" = ? and \"ORDER-TYPE\" != 'Test'";

                return await connection.QueryAsync<FileData>(FilesSqlQuery,new { Id= id});
        
            }