Проблема открытия соединения SQL для вставки значений текстового поля - PullRequest
1 голос
/ 28 марта 2011

Прежде всего, я хотел бы сказать, что это самый блестящий форум, с которым я столкнулся в моем программировании, и я ловлю гугл-рыбу за всю помощь, которую я могу получить за последние три месяца.Отличная поддержка и еще больший стиль # значок некроманта .

Хватит лести.

Я занимаюсь практическим проектом, сайт страхования.Прямо сейчас мне нужно получить пользовательский ввод из текстовых полей в базу данных.Я видел множество связанных вопросов здесь, но я получаю сообщение об ошибке в моем соединении, которое я не нашел ни в одном из других постов, и я настолько невежественен, что трудно применять примеры, которые точно не соответствуют тому, чтоЯ делаю.(В качестве примечания мой тренер специально хочет использовать самую основную форму этого кода, и поэтому сказал мне не беспокоиться о параметризации запросов для обеспечения безопасности или использовать блок try-catch для исключений, но большое спасибо за ответы здесьдля этих указателей)

Я получаю сообщение об ошибке: «Не удалось сгенерировать пользовательский экземпляр SQL Server из-за сбоя при запуске процесса для пользовательского экземпляра. Соединение будет закрыто».

Я неправильно понял мой синтаксис?Я правильно использую значение TextBox1.Text?Я слишком глуп, чтобы делать это?

using System;  
using System.Text;  
using System.Collections.Generic;  
using System.Linq;  
using System.Data;  
using System.Data.Sql;  
using System.Data.SqlClient;  
using System.Web;  
using System.Web.UI;  
using System.Web.UI.WebControls;  

public partial class SubmissionPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        String connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\aspnetdb.mdf;Integrated Security=True;User Instance=True";
        SqlConnection sqlConn = new SqlConnection(connectionString);

        sqlConn.Open();

        String thisQuery = "INSERT INTO Customer (" + " Name, SIC_NAIC, Address, City, State, Zip, " + ") VALUES (" + " @TextBox1.Text, @RadioButtonList1.SelecedItem, @TextBox2.Text, @DropDownList1.SelectedItem, @TextBox3.Text" + ")"; 
        SqlCommand thisCommand = new SqlCommand(thisQuery, sqlConn);

        thisCommand.ExecuteNonQuery();
        sqlConn.Close();
    }
}

Ответы [ 6 ]

2 голосов
/ 28 марта 2011

Проверьте это и используйте параметры sql:

 using (var conn = new SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=aspnetdb;Integrated Security=True;Connect Timeout=30;User Instance=True"))
            {

                conn.Open();
                using (var cmd = new SqlCommand("INSERT INTO Customer (Name,SIC_NAIC) VALUES (@Name,@SIC_NAIC)",conn))
                {
                    try
                    {
                        cmd.Parameters.Add("@Name", SQlDbType.VarChar, 50).Value = TextBox1.Text;
                        cmd.Parameters.Add("@SIC_NAIC", SQlDbType.VarChar, 50).Value = RadioButtonList1.SelecedItem.ToString();



                        cmd.ExecuteNonQuery();


                    }
                    catch (Exception)
                    {
                        {
                                                      }

                        throw;
                    }
                    finally
                    {
                        if (conn.State == ConnectionState.Open) conn.Close();
                    }
                }

Убедитесь, что вы загрузили sqlmanagement studio 2008 express .., а затем присоедините к нему asp.netdb и измените строку подключения sql.

sql ms

Привет

0 голосов
/ 29 марта 2011

Хорошо, ребята, во-первых, я поражен той полезностью, которую нашел здесь. Я буду стековым потоком на всю жизнь. Спасибо всем, что нашли время и опыт, чтобы помочь незнакомцу. Я не мог бы сделать это без этого.

Я хотел опубликовать код, который у меня получился, просто для того, чтобы иметь запись того, что на самом деле работало для меня на тот случай, если кому-то с той же проблемой понадобится увидеть конечный результат. В соответствии с рекомендацией @ Yetanothercoder, я поместил эту строку подключения в свой файл webconfig, и она выглядела примерно так (от? Xml версии ... до конфигурации, просто чтобы показать, где я разместил код, так как сам задавался вопросом об этом, строка подключения заключена в теги):

<?xml version="1.0"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <connectionStrings>
    <add name="MyConnectionString" connectionString="Data Source=The-Crushinator\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ArgonautSubmission.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/>
  </connectionStrings>

И, хотя мой тренер заверил меня, что предложенный блок @yetanothercoder должен быть в порядке, он не работает для меня, поэтому я использовал пример из ответа @chaps, не забывая вставить значение TextBox4.Text забыл , Код выглядит так:

using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class SubmissionPage : System.Web.UI.Page
{



    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {

        string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
        String thisQuery = "INSERT INTO Customer (Name, SIC_NAIC, Address, City, State, Zip) VALUES ('" + TextBox1.Text + "', '" + RadioButtonList1.SelectedItem.Text + "', '" + TextBox2.Text + "', '" + TextBox3.Text + "', '" + DropDownList1.SelectedItem.Text + "', '" + TextBox4.Text + "')";

        using (SqlConnection sqlConn = new SqlConnection(connectionString))
        {
            sqlConn.Open();

            using (SqlCommand command = new SqlCommand(thisQuery, sqlConn))
            {
                command.ExecuteNonQuery();
            }
        }
    }
}

Затем пришла более запутанная часть. Чтобы избавить себя от страшного сообщения об ошибке «Не удалось сгенерировать пользовательский экземпляр SQL Server из-за сбоя при запуске процесса для пользовательского экземпляра. Соединение будет закрыто», я перешел по этой ссылке из @ еще один кодер, и обнаружил, что мне нужно установить Sql Server Management Studio Express. Мне пришлось использовать Microsoft Web Platform Installer, потому что, когда я пытался следовать инструкциям на msdn.com для загрузки ssmse, я продолжал получать циклическую ошибку. Я установил ssmse, открыл окно запроса с помощью кнопки «новый запрос» и выполнил эту команду

exec sp_configure 'user instances enabled', 1. 

Go Перенастройка

затем я перезапустил sql server, добавил новую базу данных в свой проект asp.net и BAM! Это сработало! Информация о пользователе была сохранена в базе данных, куда она должна была пойти! Я был настолько подготовлен к ожиданию сбоя в моем коде, что мне казалось, что моя первая ракета выходит на орбиту. Потрясающие. Еще раз спасибо всем, и я надеюсь, что это помогает кому-то в подобной ситуации.

0 голосов
/ 28 марта 2011

Прежде всего, если ваш mdf находится в App_Data, тогда ваша строка подключения неверна.
Поместите следующее в ваш web.config

<connectionStrings>
    <add name="MyConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\aspnetdb.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/>
</connectionStrings>

Теперь назовите это как

string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;

Вот исправление вашей ошибки. Но у вас должен быть установлен экземпляр SQL Express, который, как я полагаю, станет стандартным для Visual Studio.

http://www.aspdotnetfaq.com/Faq/fix-error-Failed-to-generate-a-user-instance-of-SQL-Server-due-to-a-failure-in-starting-the-process-for-the-user-instance.aspx

И пока вы занимаетесь этим, измените событие Button_Click следующим образом

protected void Button1_Click(object sender, EventArgs e)
{

    string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
    string sql = "INSERT INTO Customer (Name, SIC_NAIC, Address, City, State, Zip) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}')";

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        string query = String.Format(sql, 
            TextBox1.Text, 
            RadioButtonList1.SelectedItem.Text, 
            TextBox2.Text, 
            DropDownList1.SelectedItem.Text, 
            TextBox3.Text, 
            "000000");
        using (SqlCommand command = new SqlCommand(query, connection))
        {
            command.ExecuteNonQuery();
        }
    }
}

Также имейте в виду, что вы не можете вставить RadioButtonList1.SelecedItem или DropDownList1.SelectedItem в базу данных. Вы должны добавить к ней .Text или .Value согласно вашему требованию.

0 голосов
/ 28 марта 2011

В дополнение к ответам, касающимся экземпляров базы данных SQL, ваш запрос SQL выглядит неправильно. Попробуйте изменить встроенный запрос на:

String thisQuery = "INSERT INTO Customer (Name, SIC_NAIC, Address, City, State, Zip) VALUES ('" + TextBox1.Text + "', '" + RadioButtonList1.SelecedItem.Text + "', '" + TextBox2.Text + "', '" + DropDownList1.SelectedItem.Text + "', '" + TextBox3.Text + "', '" + TextBoxZip.Text + "')";

Это отформатирует инструкцию SQL из значений в вашей форме.

ПРИМЕЧАНИЕ. Предполагается, что в полях SIC_NAIC и State хранятся текстовые значения и дополнительное поле для Zip (TextBoxZip).

0 голосов
/ 28 марта 2011

может быть связано с проблемой разрешения, проверьте журнал событий.вы можете попробовать удалить User Instance = True из строки подключения

0 голосов
/ 28 марта 2011

Эта ошибка часто возникает из-за того, что родительский экземпляр (по какой-либо причине) не может скопировать системные базы данных в папки локального изолированного хранилища пользователей. Иногда это из-за предыдущей установки SQL Express оставил файлы в этом каталоге. Полная история здесь http://social.msdn.microsoft.com/Forums/en/sqldatabaseengine/thread/f5eb164d-9774-4864-ae05-cac99740949b

...