【问题标题】:Is there a way i can reuse this code in C#有没有办法我可以在 C# 中重用这段代码
【发布时间】:2016-12-11 08:34:54
【问题描述】:

有没有办法可以在执行 SQL 事务时重用这些代码,我想把它变成一个方法,这样我就可以设置参数来执行其他存储过程, 你们能帮我设计一个好的编码结构吗?

 try {
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                using (SqlCommand cmd = new SqlCommand("InsertUser2Sp", con) {
                    CommandType = CommandType.StoredProcedure
                }) {
                    cmd.Parameters.AddWithValue("@UserID", useridStr);
                    cmd.Parameters.AddWithValue("@Firstname", firstnStr);
                    cmd.Parameters.AddWithValue("@Middlename", middleNstr);
                    cmd.Parameters.AddWithValue("@Lastname", lastnStr);
                    cmd.Parameters.AddWithValue("@UserAge", ageInt);
                    cmd.Parameters.AddWithValue("@HomeAddress", homeaddStr);

                    con.Open();
                    cmd.ExecuteNonQuery();
                }
            }
        } catch (Exception ex) {
            MessageBox.Show("Could not connect to database. Check settings. " + ex.Message, "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            MessageBox.Show(ex.Message);
        }
    }

【问题讨论】:

  • @GrantWinney 在reuse this codes in executing SQL transaction的帖子中很清楚
  • @GrantWinney 我想做一个可以执行插入、编辑、删除、选择和使用不同参数的方法。可能吗?同时我在存储过程中设置了一个条件来知道它是否是插入、更新、删除事务,所以我不会重复做参数部分

标签: c# sql-server visual-studio optimization code-reuse


【解决方案1】:

我将在这里分享一个通用方法。您需要做的就是构建一个与您的 SP 中的参数具有相同属性名称(包括大小写)的对象。

protected internal string GetSingleValue_String(String spname, Object entity)
        {
            Object res = new Object();
            String conString = String.Empty;
            using (SqlConnection con = new SqlConnection(ConnectionString))
            {
                con.Open();
                SqlCommand cmd = new SqlCommand(spname, con);
                cmd.CommandType = CommandType.StoredProcedure;
                if (entity != null)
                {
                    SqlCommandBuilder.DeriveParameters(cmd);
                    PropertyInfo entitymember = default(PropertyInfo);
                    foreach (SqlParameter _param in cmd.Parameters)
                    {
                        if (_param.Direction == ParameterDirection.Input)
                        {
                            entitymember = entity.GetType().GetProperty(_param.ParameterName.Replace("@", ""));
                            var entityValue = entitymember.GetValue(entity, null);
                            String _paramvalue = entityValue != null ? entityValue.ToString() : null; 
                            _param.Value = (string.IsNullOrEmpty(_paramvalue) || _paramvalue == string.Empty ? null : _paramvalue);
                        }
                    }
                }
                res = cmd.ExecuteScalar();
                cmd.Connection.Close();
                entity = null;
                cmd = null;
                if(res==null)
                    res = "";
                else if (String.IsNullOrEmpty(res.ToString()))
                    res = "";
                return res.ToString();
            }
        }

因此,在您的示例中,创建一个与您的 SP 参数具有相同定义的新类。

class NewClass()
{
    public string UserID { get; set; }
    public string Firstname { get; set; }
    public string Middlename { get; set; }
    public string Lastname { get; set; }
    public string UserAge { get; set; }
    public string HomeAddress { get; set; }
}

并且会像这样调用方法。

var newClass = new NewClass
{ 
    UserID = "UserId",
    Firstname = "Firstname",
    Middlename = "Middlename",
    Lastname = "Lastname",
    UserAge = "UserAge",
    HomeAddress = "HomeAddress"
}

var res = GetSingleValue_String("InsertUser2Sp", newClass); 

不介意返回类型。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多