尝试获取SQL查询的值为一个字符串

问题描述:

我在我的WPF C#应用程序里面的SQL Server上运行SQL查询。该查询返回一个字符串,其中包含值MYCOUNT,我想返回GetNumber。如何返回值MYCOUNT仅用于获取数字而不是整个字符串?尝试获取SQL查询的值为一个字符串

public string GetNumber(string SkillNumber)  
{ 
    DateTime dte = DateTime.Today; 
    string fixedStartDate = String.Format("{0:yyyy-MM-dd " + "05:00:00.000" + "}", dte); 
    string fixedEndDate = String.Format("{0:yyyy-MM-dd " + "05:00:00.000" + "}", dte.AddDays(1)); 

    using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(SQLHelper.CnnCal("OADB"))) 
    { 
     var x = connection.Query($"SELECT COUNT(SOURCEID) AS 'MYCOUNT' " 
         + "FROM [OADB].[oadb].[CmsCallHistory] " 
         + "WHERE disposition = 2 and DISPSPLIT in (" + SkillNumber + ") AND SEGSTOP BETWEEN '" + 
         fixedStartDate + "' and '" + fixedEndDate + "'"); 

     return x.ToString(); 
    } 
} 

这是什么返回。我只需要返回值:

enter image description here

+0

你能准确地展示你所得到的吗? – Snympi

+0

你在使用什么样的ORM?看起来是Dapper,但有些东西并不完全正确。 – Steve

+0

小巧。我添加了一个屏幕截图。对不起,最初缺乏细节 – mrcavanaugh09

由于Dapper查询方法返回的是IEnumerable而不是单个值(实际上,您可以看到在IEnumerable中返回了一个对象(一个int),并且该对象的值为'767'),您会收到错误

在小巧玲珑的,你可以使用的ExecuteScalar拿到一个标量值作为查询返回

var x = connection.ExecuteScalar<int>(.....) 

您仍然可以使用查询方法,但有一个LINQ扭曲

var x = connection.Query(.....).Single(); 

关于Sql Injection的常见警告适用于您的代码,尽管parameterize an IN clause并不那么简单。这两个日期应该是明确的参数,以避免解析你认为是日期和SQL Server及其语言环境考虑将字符串转换为日期时间之间的不兼容问题。

你的回答是MSDN文档中: https://msdn.microsoft.com/en-us/library/system.data.idbconnection(v=vs.110).aspx

您可以尝试使用

using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(SQLHelper.CnnCal("OADB"))) 
{ 
    IDbCommand command = connection.createCommand(); 
    command.CommandText = $"SELECT COUNT(SOURCEID) AS 'MYCOUNT' " 
        + "FROM [OADB].[oadb].[CmsCallHistory] " 
        + "WHERE disposition = 2 and DISPSPLIT in (" + SkillNumber + ") AND SEGSTOP BETWEEN '" + 
        fixedStartDate + "' and '" + fixedEndDate + "'"; 
    return (string)command.ExecuteScalar(); 
} 

另注:你想尝试完成后关闭连接。我建议把它放在try/catch/finally语句中,这样你就可以在'finally'部分关闭你的连接。

希望这会有所帮助!

+1

连接在使用语句结束时是否关闭?整个事情会在我想的那个时候被垃圾收集。 – mrcavanaugh09

+0

这是香草的ADO.NET,它不是Dapper。 – Steve

+0

@ mrcavanaugh09也许会。我喜欢以离开连接的方式生活。如果连接在您运行此代码时打开,那么您可以让任何给您开放连接的人自行关闭它。如果这个方法是打开连接的方法,那么它应该是关闭它的人(只是为了安全起见)。 –