Как я уже сказал в своем комментарии, ваш дизайн плох!
Сначала у вас должен быть уровень доступа к данным. Это должно быть проект в больших решениях, но в вашем случае вы можете поместить его в новый каталог. В этом каталоге вы создаете класс SqlManager, вот код:
public class SqlManager
{
public static string ConnectionString
{
get
{
return ConfigurationManager.ConnectionStrings["DevConnString"].ConnectionString;
}
}
public static SqlConnection GetSqlConnection(SqlCommand cmd)
{
if (cmd.Connection == null)
{
SqlConnection conn = new SqlConnection(ConnectionString);
conn.Open();
cmd.Connection = conn;
return conn;
}
return cmd.Connection;
}
public static int ExecuteNonQuery(SqlCommand cmd)
{
SqlConnection conn = GetSqlConnection(cmd);
try
{
return cmd.ExecuteNonQuery();
}
catch
{
throw;
}
finally
{
conn.Close();
}
}
public static object ExecuteScalar(SqlCommand cmd)
{
SqlConnection conn = GetSqlConnection(cmd);
try
{
return cmd.ExecuteScalar();
}
catch
{
throw;
}
finally
{
conn.Close();
}
}
public static DataSet GetDataSet(SqlCommand cmd)
{
return GetDataSet(cmd, "Table");
}
public static DataSet GetDataSet(SqlCommand cmd, string defaultTable)
{
SqlConnection conn = GetSqlConnection(cmd);
try
{
DataSet resultDst = new DataSet();
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(resultDst, defaultTable);
}
return resultDst;
}
catch
{
throw;
}
finally
{
conn.Close();
}
}
public static DataRow GetDataRow(SqlCommand cmd)
{
return GetDataRow(cmd, "Table");
}
public static DataRow GetDataRow(SqlCommand cmd, string defaultTable)
{
SqlConnection conn = GetSqlConnection(cmd);
try
{
DataSet resultDst = new DataSet();
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(resultDst, defaultTable);
}
if (resultDst.Tables.Count > 0 && resultDst.Tables[0].Rows.Count > 0)
{
return resultDst.Tables[0].Rows[0];
}
else
{
return null;
}
}
catch
{
throw;
}
finally
{
conn.Close();
}
}
}
После этого у вас должен быть слой бизнес-объекта. В более крупном решении находится проект в вашем каталоге case. Если вы находитесь на странице TaxesEdit.aspx, вы должны добавить класс Tax.cs в BO (бизнес-объект).
Пример методов класса, для вашей первой кнопки:
public DataSet GetTaxesByUserName(string userName)
{
SqlCommand cmd = new SqlCommand(@"
select 1 from Table where Name [email protected]");
cmd.Parameters.AddWithValue("@UserName", userName);
return DA.SqlManager.GetDataSet(cmd);
}
Вы получать все необходимые данные в наборах данных. После того, что вы делаете проверки, как taxesDst.Tables [0] .Rows.Count> 0 (или == 0)
Для вставки вы можете иметь метод, как это:
public virtual void Insert(params object[] colValues)
{
if (colValues == null || colValues.Length % 2 != 0)
throw new ArgumentException("Invalid column values passed in. Expects pairs (ColumnName, ColumnValue).");
SqlCommand cmd = new SqlCommand("INSERT INTO " + TableName + " ({0}) VALUES ({1})");
string insertCols = string.Empty;
string insertParams = string.Empty;
for (int i = 0; i < colValues.Length; i += 2)
{
string separator = ", ";
if (i == colValues.Length - 2)
separator = "";
string param = "@P" + i;
insertCols += colValues[i] + separator;
insertParams += param + separator;
cmd.Parameters.AddWithValue(param, colValues[i + 1]);
}
cmd.CommandText = string.Format(cmd.CommandText, insertCols, insertParams);
DA.SqlManager.ExecuteNonQuery(cmd);
}
Для этого вам необходимо иметь Свойство TableName в текущем классе BO.
В этом случае эти методы могут использоваться повсюду, и вам нужно только одну строку кода, чтобы вызвать их, и никаких проблем, подобных вашим, не произойдет.
закрыть свой первый 'using' блок перед выполнением' cmd2', Вы также можете использовать 'ExecuteScalar' и получить первую строку первым вместо использования 'ExecuteReader' – Habib
, но вставляя новый код пользователя, следует использовать оба из них с помощью –
Нет инструкции INSERT * (SQL) * ?? , * anyway * выполнить отдельный оператор для INSERT – Habib