#c# #sql #sql-server #sql-update
#c# #sql #sql-сервер #sql-обновление
Вопрос:
У меня есть вызываемая таблица базы данных SQL Server ProductProfiles
, которая содержит продукты и их информацию (по одному продукту на строку). На сайте, над которым я работаю, пользователи могут загружать .csv
файл с изменениями в любом или всех столбцах для продукта или продуктов.
У меня есть функция, которая задает UPDATE
запрос, предназначенный для замены любой «старой» информации новой информацией из .csv
файла. Похоже, я не получаю никаких ошибок ( try-catch
не сообщает о каких-либо ошибках, и я не вижу ошибок в консоли).
Тем не менее, всякий раз, когда загружается действительный .csv
файл с изменениями, эти изменения никогда не вносятся в базу данных. Я протестировал UPDATE
запрос в SQL Server Management Studio, и, похоже, он работает нормально.
Эта функция имеет UPDATE
запрос:
private void SaveProfile(string[] curProfile)
{
string profid = "";
//have an update and an insert statement based on whether the profileid exists or is new
string ProfileID = GetValue(curProfile, (int)ProfileColumns.ProfileId).Trim();
string getProfId = "SELECT ProfileID FROM ProductProfile WHERE ProfileID = @ProfileID";
using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["AbleCommerce"].ToString()))
{
SqlCommand cmd = new SqlCommand(getProfId, cn);
cmd.Parameters.AddWithValue("@ProfileID", ProfileID);
cmd.CommandType = CommandType.Text;
cn.Open();
using (IDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
profid = reader["ProfileID"].ToString();
if (profid != "")
{
try
{
string query = "UPDATE ProductProfile SET (Name = @Name, Description = @Description, SpeciesLink = @SpeciesLink, LineDraw = @LineDraw, LineDrawThumbnail = @LineDrawThumbnail, ProfileThumbnail = @ProfileThumbnail, ComponentThickness = @ComponentThickness, ComponentWidth = @ComponentWidth, FinishedThickness = @FinishedThickness, FinishedWidth = @FinishedWidth, ClassificationID = @ClassificationID, StockOfCust = @StockOrCust, ComponentFactor = @ComponentFactor, Visibility = @Visibility, Notes = @Notes) WHERE ProfileID = @profid";
SqlCommand cmd2 = new SqlCommand(query, cn);
cmd.CommandType = CommandType.Text;
// cn.Open();
cmd.Parameters.AddWithValue("@profid", profid);
cmd.Parameters.AddWithValue("@Name", GetValue(curProfile, (int)ProfileColumns.Name).Trim());
cmd.Parameters.AddWithValue("@Description", GetValue(curProfile, (int)ProfileColumns.Description).Trim());
cmd.Parameters.AddWithValue("@SpeciesLink", GetValue(curProfile, (int)ProfileColumns.SpeciesLink).Trim());
cmd.Parameters.AddWithValue("@Linedraw", GetValue(curProfile, (int)ProfileColumns.LineDraw).Trim());
cmd.Parameters.AddWithValue("@LineDrawThumbnail", GetValue(curProfile, (int)ProfileColumns.LineDrawThumbnail).Trim());
cmd.Parameters.AddWithValue("@ProfileThumbnail", GetValue(curProfile, (int)ProfileColumns.ProfileThumbnail).Trim());
cmd.Parameters.AddWithValue("@ComponentThickness", GetValue(curProfile, (int)ProfileColumns.ComponentThickness).Trim());
cmd.Parameters.AddWithValue("@ComponentWidth", GetValue(curProfile, (int)ProfileColumns.ComponentWidth).Trim());
cmd.Parameters.AddWithValue("@FinishedThickness", GetValue(curProfile, (int)ProfileColumns.FinishedThickness).Trim());
cmd.Parameters.AddWithValue("@FinishedWidth", GetValue(curProfile, (int)ProfileColumns.FinishedWidth).Trim());
cmd.Parameters.AddWithValue("@ClassificationID", GetValue(curProfile, (int)ProfileColumns.ClassificationID).Trim());
cmd.Parameters.AddWithValue("@StockOrCust", GetValue(curProfile, (int)ProfileColumns.StockOrCust).Trim());
cmd.Parameters.AddWithValue("@ComponentFactor", GetValue(curProfile, (int)ProfileColumns.ComponentFactor).Trim());
cmd.Parameters.AddWithValue("@Visibility", GetValue(curProfile, (int)ProfileColumns.Visibility).Trim());
cmd.Parameters.AddWithValue("@Notes", GetValue(curProfile, (int)ProfileColumns.Notes).Trim());
cmd.Parameters.AddWithValue("@OrderBy", GetValue(curProfile, (int)ProfileColumns.OrderBy).Trim());
int profileID = Convert.ToInt32(GetValue(curProfile, (int)ProfileColumns.ProfileId));
SaveArtchStyle(profileID, curProfile);
SaveAssignedItems(profileID, curProfile);
}
catch (Exception ex)
{
Response.Write("ERROR: " ex.Message.ToString() "<br />");
ErrorLabel.Text = "There was an error with the ProfileID.";
}
}
}
}
cmd.ExecuteNonQuery();
cn.Close();
}
}
Эта функция вызывает SaveProfile
функцию:
protected void ProcessFileAction(string theStream)
{
try
{
int LineCount = 1;
using (StreamReader sr = new StreamReader(theStream))
{
string line;
while ((line = sr.ReadLine()) != null)
{
if (LineCount > 1 amp;amp; line.Trim() != string.Empty)
{
string[] tmpArray = line.Split('t');
//save changes
string ProfileID = GetValue(tmpArray, (int)ProfileColumns.ProfileId);
if (ProfileID != "")
SaveProfile(tmpArray);
}
LineCount ;
}
}
}
catch(Exception x)
{
Response.Write("ProcessFileAction Error: " x.Message.ToString() "<br />");
}
//ErrorLabel.Text = "Import Complete on <b><i>" FileUpload1.PostedFile.FileName "</i></b><br/>";
}
Комментарии:
1. Откуда вы получаете исключение, упомянутое в названии вопроса? Каково состояние объектов среды выполнения, когда это происходит? Вы проводили какую- либо отладку по этому поводу? Когда вы выполняете отладчик, где происходит сбой?
2. Вы заметили, что в вашем заявлении об обновлении не используется параметр OrderBy?
3. Вы смешиваете две команды SqlCommands. У вас есть один assinged для
cmd
запуска запроса select ( почему? ), А затем назначить запрос обновления SqlCommandcmd2
. Однако параметры добавляютсяcmd
, а затем вне вашего цикла вы вызываетеExecuteNonQuery
cmd, где вы должны были использоватьcmd2
. Вывод: ваш код никогда не вызывает ваш запрос на обновление, следовательно, в базе данных нет обновлений.4. @rene: и, кроме того,
cmd2
который содержитUPDATE
, никогда не выполняется….
Ответ №1:
Попробуйте с этим.
private void SaveProfile(string[] curProfile)
{
string profid = "";
//have an update and an insert statement based on whether the profileid exists or is new
string ProfileID = GetValue(curProfile, (int)ProfileColumns.ProfileId).Trim();
string getProfId = "SELECT ProfileID FROM ProductProfile WHERE ProfileID = @ProfileID";
using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["AbleCommerce"].ToString()))
{
SqlCommand cmd = new SqlCommand(getProfId, cn);
cmd.Parameters.AddWithValue("@ProfileID", ProfileID);
cmd.CommandType = CommandType.Text;
cn.Open();
using (IDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
profid = reader["ProfileID"].ToString();
if (profid != "")
{
try
{
string query = "UPDATE ProductProfile SET (Name = @Name, Description = @Description, SpeciesLink = @SpeciesLink, LineDraw = @LineDraw, LineDrawThumbnail = @LineDrawThumbnail, ProfileThumbnail = @ProfileThumbnail, ComponentThickness = @ComponentThickness, ComponentWidth = @ComponentWidth, FinishedThickness = @FinishedThickness, FinishedWidth = @FinishedWidth, ClassificationID = @ClassificationID, StockOfCust = @StockOrCust, ComponentFactor = @ComponentFactor, Visibility = @Visibility, Notes = @Notes) WHERE ProfileID = @profid";
SqlCommand cmd2 = new SqlCommand(query, cn);
cmd2.CommandType = CommandType.Text;
cmd2.Parameters.AddWithValue("@profid", profid);
cmd2.Parameters.AddWithValue("@Name", GetValue(curProfile, (int)ProfileColumns.Name).Trim());
cmd2.Parameters.AddWithValue("@Description", GetValue(curProfile, (int)ProfileColumns.Description).Trim());
cmd2.Parameters.AddWithValue("@SpeciesLink", GetValue(curProfile, (int)ProfileColumns.SpeciesLink).Trim());
cmd2.Parameters.AddWithValue("@Linedraw", GetValue(curProfile, (int)ProfileColumns.LineDraw).Trim());
cmd2.Parameters.AddWithValue("@LineDrawThumbnail", GetValue(curProfile, (int)ProfileColumns.LineDrawThumbnail).Trim());
cmd2.Parameters.AddWithValue("@ProfileThumbnail", GetValue(curProfile, (int)ProfileColumns.ProfileThumbnail).Trim());
cmd2.Parameters.AddWithValue("@ComponentThickness", GetValue(curProfile, (int)ProfileColumns.ComponentThickness).Trim());
cmd2.Parameters.AddWithValue("@ComponentWidth", GetValue(curProfile, (int)ProfileColumns.ComponentWidth).Trim());
cmd2.Parameters.AddWithValue("@FinishedThickness", GetValue(curProfile, (int)ProfileColumns.FinishedThickness).Trim());
cmd2.Parameters.AddWithValue("@FinishedWidth", GetValue(curProfile, (int)ProfileColumns.FinishedWidth).Trim());
cmd2.Parameters.AddWithValue("@ClassificationID", GetValue(curProfile, (int)ProfileColumns.ClassificationID).Trim());
cmd2.Parameters.AddWithValue("@StockOrCust", GetValue(curProfile, (int)ProfileColumns.StockOrCust).Trim());
cmd2.Parameters.AddWithValue("@ComponentFactor", GetValue(curProfile, (int)ProfileColumns.ComponentFactor).Trim());
cmd2.Parameters.AddWithValue("@Visibility", GetValue(curProfile, (int)ProfileColumns.Visibility).Trim());
cmd2.Parameters.AddWithValue("@Notes", GetValue(curProfile, (int)ProfileColumns.Notes).Trim());
cmd2.Parameters.AddWithValue("@OrderBy", GetValue(curProfile, (int)ProfileColumns.OrderBy).Trim());
int profileID = Convert.ToInt32(GetValue(curProfile, (int)ProfileColumns.ProfileId));
SaveArtchStyle(profileID, curProfile);
SaveAssignedItems(profileID, curProfile);
cmd2.ExecuteNonQuery();
}
catch (Exception ex)
{
Response.Write("ERROR: " ex.Message.ToString() "<br />");
ErrorLabel.Text = "There was an error with the ProfileID.";
}
}
}
}
cn.Close();
}
}