Я оставляю этот вопрос и отвечу сюда, чтобы люди не сходили с ума и искали все возможные решения вручную, как я. Я обнаружил, что добавление контекста в метод Configure IdentityHostingStartup.cs вызывало проблему. Я изменил место, где я добавил контекст к методу Configure для Startup.cs, и он работал нормально.
namespace ShareAndCare
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddDbContext<ShareAndCareContext>(options =>
options.UseLazyLoadingProxies().UseSqlServer(
Configuration.GetConnectionString("ShareAndCareContextConnection")));
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthentication();
app.UseCookiePolicy();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
Надеюсь, я понял вашу проблему:
Прежде всего, я думаю, очень важно определить вашу модель данных. Например, чтобы пользователь мог определить много ключей, я бы использовал другую таблицу, в которой все ключи были сохранены, после чего вам нужно определить, может ли один и тот же ключ быть связан с несколькими строками таблицы. «LicenseDB» (в таблице «LicenseDB» у вас есть столбцы «Название компании», «Название программного обеспечения», «LicenseFileNo»). В этом случае у вас будет отношение (n: n), а затем вам нужно будет создать другую промежуточную таблицу, которая определяет отношение между таблицей 'keys' и таблицей 'LicenseDB'. Если это не так, то вы просто определяете отношение между ключами и LicenseDB (n: 1), добавляя столбец licenseDbID к таблице keys, который связывает множество ключей с одной строкой в таблице LicenseDB [112 ]
С другой стороны, проблема с вашим кодом заключается в том, что вы пытаетесь вставить данные, а не читать данные, поэтому вам не нужен DataReader, вместо этого вы просто можете реализовать что-то вроде этого: [113 ]
using (SqlConnection con = new SqlConnection('YOUR STRING CONNECTION'))
{
con.Open();
string comando = "INSERT INTO LicenseDB (companie, software) VALUES ('" + lbGeneratedKeys.Items[0].ToString() + "','" + lbGeneratedKeys.Items[1].ToString() + "')";
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = comando;
cmd.Connection = con;
cmd.ExecuteNonQuery();
}
В этом случае два значения вставляются в таблицу LicenseDB - значения для названия компании и программного обеспечения.
Я надеюсь, что помог вам.
Я вернулся к своему предыдущему школьному проекту и сумел сохранить данные списка в базу данных SQL. Всего у меня есть два списка: один для разрешения пользователю экспортировать в виде текстового файла, а второй - специально для хранения только сгенерированных лицензионных ключей. Второй список не установлен в моей программе.
Коды, которые я использовал:
private void exportKey_Click(object sender, EventArgs e)
{
//adding into local database
//excludes adding licensekeys
SqlConnection sqlCon = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\User\Documents\Database.mdf;Integrated Security=True;Connect Timeout=30");
sqlCon.Open();
SqlCommand sqlCmd = new SqlCommand("addLicensedata", sqlCon);
sqlCmd.CommandType = CommandType.StoredProcedure;
sqlCmd.Parameters.AddWithValue(@"companyName", companyTextbox.Text.Trim());
sqlCmd.Parameters.AddWithValue(@"softwareName", softwareTextbox.Text.Trim());
sqlCmd.Parameters.AddWithValue(@"prodID", prodidTextbox.Text.Trim());
sqlCmd.Parameters.AddWithValue(@"licenseType", cbLicensetype.Text.Trim());
sqlCmd.Parameters.AddWithValue(@"LicenseNo", licensekeyNum.Text.Trim()); //no of license keys
sqlCmd.ExecuteNonQuery();
//MessageBox.Show("Added to database");
sqlCon.Close();
if (cbLicensetype.SelectedItem.ToString() == "Trial")
{
sqlCmd.Parameters.AddWithValue(@"TrialDays", tbTrialdays.Text.Trim());
}
addtoFKtable();
private void addtoFKtable()
{
SqlConnection Con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\User\Documents\Database.mdf;Integrated Security=True;Connect Timeout=30");
Con.Open();
SqlCommand Cmd = new SqlCommand("addLicensekeys", Con);
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Parameters.AddWithValue(@"LicenseNo", licensekeyNum.Text.Trim());
Cmd.Parameters.AddWithValue(@"LicenseKeys", lbHidden.Text.Trim());
Cmd.Parameters.AddWithValue(@"prodID", prodidTextbox.Text.Trim());
Cmd.Parameters.AddWithValue(@"companyName", companyTextbox.Text.Trim());
Cmd.ExecuteNonQuery();
//MessageBox.Show("Added license to database");
Con.Close();
}
Я сохранил свои команды SQL как хранимую процедуру в базе данных и просто вызвал команду в своих кодах.