OpenEdge/Progress 查询中的数据库参数
OpenEdge/Progress DB Parameters in Query
我正在尝试编写一个小型 C# 应用程序来连接到 ProgressDB,但我在很早的阶段就失败了....编写一个带有参数的查询。对于上下文,直到上周我才取得进展(我是主流 MSSQL 猴子)
如果我在 TSQL 中编写查询,它将只是
DECLARE @Id nvarchar(15) = 'X1234'
SELECT * from People WHERE Id = @Id
现在我可以使用 ODBC 查询工具编写硬编码的 select 进度语句
Select * from People where "Id" = 'X1234'
但我不知道如何对其进行参数化,我看过 Progress/OpenEdge 知识库文章,但它似乎不像 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 首次进度查询的链接都将不胜感激谢谢(希望一切都有意义)。
google site:progress.com sql parameterized query
第一个点击 P176215 包含一个示例,我只是将其复制/粘贴到此处。
The following sample C# program shows how to build a parameterized query against an ODBC connection:
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});
}
我正在尝试编写一个小型 C# 应用程序来连接到 ProgressDB,但我在很早的阶段就失败了....编写一个带有参数的查询。对于上下文,直到上周我才取得进展(我是主流 MSSQL 猴子)
如果我在 TSQL 中编写查询,它将只是
DECLARE @Id nvarchar(15) = 'X1234'
SELECT * from People WHERE Id = @Id
现在我可以使用 ODBC 查询工具编写硬编码的 select 进度语句
Select * from People where "Id" = 'X1234'
但我不知道如何对其进行参数化,我看过 Progress/OpenEdge 知识库文章,但它似乎不像 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 首次进度查询的链接都将不胜感激谢谢(希望一切都有意义)。
google site:progress.com sql parameterized query
第一个点击 P176215 包含一个示例,我只是将其复制/粘贴到此处。
The following sample C# program shows how to build a parameterized query against an ODBC connection:
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});
}