带方法值的参数化插入查询

时间:2018-10-24 19:00:20

标签: c# sql ado.net

我有两种方法。当我调用玻璃方法时,我需要在查询中插入值。如何在查询中插入方法的值?

我正在使用MVC,C#和SQL Server。

我尝试的代码:在此方法中调用方法glas

RController re = new RController();
re.Glas(C_E);
string insert = "INSERT INTO dbo.MEP (R1) VALUES (@code)";

using (SqlCommand command = new SqlCommand(insert, con))
{
    command.Parameters.AddWithValue("@code", "HERE METHOD GLAS");
    con.Open();
    int result = command.ExecuteNonQuery();
}

方法GLAS返回一个字符串。该字符串是我需要在查询中插入的字符串。该查询位于另一个控制器方法(Rcontroller)中。

public void GLAS(string C_E)
{
     // more code
     if (i > 0)
     {
          string glas1 =  "OK";
     }
     else
     {
          string glas1 = "Fail"; 
     }
}

2 个答案:

答案 0 :(得分:1)

您当前的方法是void,并且不返回任何值。您可以通过ref传递值,也可以只是将方法更改为返回值:

public string GLAS(string C_E)
{
     //more code
     string glas1 = "OK"; 
     if (i > 0)
     {
          glas1 =  "OK";
     }
     else
     {
          glas1 = "Fail"; 
     }
     return glas1;
}

然后您可以像使用它一样

command.Parameters.AddWithValue("@code", GLAS(C_E));

此外,建议不要使用.AddWithValue,而应使用Parameters.Add(),例如:

command.Parameters.Add("@code", SqlDbType.VarChar).Value = GLAS(C_E);

答案 1 :(得分:0)

要详细说明这个主题,您有几种选择。其中一些已经详细说明。存在以下方法AddAddWithValue和整个参数集合。这提供了灵活性,但您也提到要返回一个值。

因此,要处理初始参数方面。

  • 添加:您定义参数,SQL中的类型和值。这样可以减轻潜在的数据库推断问题。您传递的值是整数,但SQL认为该值应为所定义的十进制。

  • AddWithValue:SQL将自动推断类型,只需传递一个值和参数即可。

  • 参数集合:您可以预先定义所有参数,然后只需将其传递给SqlCommand

一个示例方法是:

公共类DatabaseContext:IDbRepository {      私有只读字符串dbConnection;

 public DatabaseContext(IConfiguration configuration) => dbConnection = configuration.GetConnectionString("dbConnection");

 public bool Insert(string query, params SqlParameter[] parameters)
 {
      // If no parameters, then you really are not inserting.  Handle exception.

      using(var connection = new SqlConnection(dbConnection))
           using(var command = new SqlCommand(connection, query))
           {
                connection.Open();
                command.Parameters.AddRange(parameters);
                return (command.ExecuteNonQuery() > 0);
           }
 }

因此,从本质上讲,您将调用上下文,传递查询,参数,然后执行查询。但是您可以返回布尔值,而不是有条件的检查来分配成功或失败。打电话时,您会知道它成功了,因此您可以传回有效的状态码,即HttpStatusCode.Ok

但是您也可以在工厂包装,或者在进行交互时稍微清洁一下方法。希望这会有所帮助。