【问题标题】:how to pass an optional parameter to sql function from C#如何从 C# 将可选参数传递给 sql 函数
【发布时间】:2014-09-25 14:40:42
【问题描述】:

我有一个问题。请帮忙解决我的问题

我有一个 SQL 函数

function [dbo].[fnKudishikaAmt]
    (@ParishName nvarchar(100), @Hno int, @dateto datetime = Null)
Returns Decimal(15,2)

此函数使用执行命令显示正确的结果

Select dbo.fnKudishikaAmt('St.George Malankara Catholic Church', 29, default)

我的要求是这个函数应该从C#调用

我收到了错误

从字符串转换日期时间时转换失败

代码:

public double kudishikatotal(string ParishName, Int32 HouseNo)
{
    String SQLText = "select ChurchDB.dbo.fnKudishikaAmt(@ParishName, @Hno, @dateto) as fnresult";

    SqlCommand cmd = new SqlCommand(SQLText);
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.AddWithValue("@ParishName", ParishName);
    cmd.Parameters.AddWithValue("@Hno", HouseNo);
    cmd.Parameters.AddWithValue("@dateto", "default");

    string rval = GetSingleValue(cmd);
    double kudiamt = 0;

    if (rval != null)
    {
        kudiamt = Convert.ToDouble(rval);
    }

    return kudiamt;
}

private static string GetSingleValue(SqlCommand cmd)
{
    string ConString = connectionstring();
    string returnvalue = "";

    using (SqlConnection con = new SqlConnection(ConString))
    {
        cmd.Connection = con;
        con.Open();
        returnvalue = cmd.ExecuteScalar().ToString();
        con.Close();
    }

    return returnvalue;
}

【问题讨论】:

  • 根本不要传递那个参数。甚至不要将其添加到参数集合中
  • stackoverflow.com/questions/8358315/… 相同...但您应该显示您的函数定义。第二个参数是可为空的 DateTime 类型吗?
  • 如果我没有包含日期​​参数,我会收到错误说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。异常详细信息:System.Data.SqlClient.SqlException:必须声明标量变量“@dateto”。

标签: c# sql sql-server


【解决方案1】:

如果您已经在存储过程中声明了参数的默认值 - 那么您完全可以不从 c# 代码传递此参数,在这种情况下它将具有默认值。

在您的情况下引发异常,因为无法将字符串 "default" 转换为您的参数类型 SqlDateTime。

【讨论】:

  • 如果我们使用存储过程,我们可以避免使用默认参数,但在我的情况下,如果我没有包含日期​​参数,我会使用函数,我会收到错误说明:执行期间发生未处理的异常当前的网络请求。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。异常详细信息:System.Data.SqlClient.SqlException:必须声明标量变量“@dateto”。
【解决方案2】:

您可以在发送日期时间参数时使用 if 条件。

if(some condition)
{
 cmd.Parameters.AddWithValue("@dateto", dateTimeValue);
}

这里的 datetimeValue 是你要传递的值。因此,您将仅在需要时传递 dateTimeValue。 错误是由于您传递的字符串“default”造成的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 2021-07-27
    • 1970-01-01
    相关资源
    最近更新 更多