【问题标题】:OpenEdge/Progress DB Parameters in Query查询中的 OpenEdge/Progress DB 参数
【发布时间】:2021-05-07 21:34:02
【问题描述】:

我正在尝试编写一个小型 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" call 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 首次进度查询的建议或链接谢谢(希望一切都有意义)。

【问题讨论】:

    标签: c# openedge progress-db


    【解决方案1】:

    谷歌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# 或您想使用的任何其他客户端语言使用。

    【讨论】:

    • 为发现这一点而欢呼,令人惊讶的是我错过了这一点,但我想我是在关注细节而不是实际问题,所以谢谢。是的,我希望提供商给我一个简单的 REST API 来代替
    【解决方案2】:

    回到这一点并使用 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});
            
                }
    

    【讨论】:

      猜你喜欢
      • 2012-03-19
      • 2022-11-29
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多