【问题标题】:Parameterized Insert Query with method value带有方法值的参数化插入查询
【发布时间】:2018-10-24 19:00:20
【问题描述】:

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

我正在使用 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"; 
     }
}

【问题讨论】:

    标签: c# sql ado.net


    【解决方案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);
    

    【讨论】:

    • 当我把 return 放在那个地方时它给了我错误,它不能识别变量 glas1
    • 像我一样做,你必须在if之前定义glas1并在if中分配它,你已经在if中定义了它,所以它不能在if范围之外使用。
    • 谢谢,我的错,我会处理剩下的。
    【解决方案2】:

    要详细说明此主题,您有多种选择。其中一些已经详细阐述。存在以下方法,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

    但您也可以封装在工厂中,或者在交互时稍微清理一下方法。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-03-13
      • 1970-01-01
      • 2017-06-03
      • 2020-05-23
      • 1970-01-01
      • 2018-01-22
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多