Asp.Net выберите в Sql - PullRequest
       10

Asp.Net выберите в Sql

3 голосов
/ 01 апреля 2009

Это будет очень просто, я знаю. Я видел очень много разных способов использования sql в asp.net без реального стандарта. То, что я хочу знать, как правильно выбрать из базы данных SQL в asp.net и получить несколько записей. Например: выберите все идентификаторы пользователей.

String sql = 
  "SELECT [UserId] FROM [UserProfiles] WHERE NOT [UserId] = 'CurrentUserId'";

string strCon = System.Web
                      .Configuration
                      .WebConfigurationManager
                      .ConnectionStrings["SocialSiteConnectionString"]
                      .ConnectionString;

SqlConnection conn = new SqlConnection(strCon);
SqlCommand comm = new SqlCommand(sql, conn);
conn.Open();

/*
 This is where I need to know how to retrieve the information from the
 above command(comm). I am looking for something similiar to php's
 mysql_result. I want to access the records kind of like an array or some
 other form of retrieving all the data.
 Also when the new SqlCommand is called...does that actual run the
 SELECT STATEMENT or is there another step. 
*/

conn.Close();

Ответы [ 5 ]

6 голосов
/ 01 апреля 2009

Я думаю, что это то, что вы ищете.

String sql = "SELECT [UserId] FROM [UserProfiles] WHERE NOT [UserId] = 'CurrentUserId'";

string strCon = System.Web
                      .Configuration
                      .WebConfigurationManager
                      .ConnectionStrings["SocialSiteConnectionString"].ConnectionString;

SqlConnection conn = new SqlConnection(strCon);
SqlCommand comm = new SqlCommand(sql, conn);
conn.Open();
SqlDataReader nwReader = comm.ExecuteReader();
while (nwReader.Read())
{
    int UserID = (int)nwReader["UserID"];
    // Do something with UserID here...
}
nwReader.Close();
conn.Close();

Я должен сказать, однако, что общий подход может использовать много настроек. Во-первых, вы могли бы по крайней мере начать с упрощения доступа к вашей ConnectionString. Например, вы можете добавить следующее в ваш файл Global.asax.cs:

   using System;
   using System.Configuration;

   public partial class Global : HttpApplication
   {
      public static string ConnectionString; 

      void Application_Start(object sender, EventArgs e)
      { 
          ConnectionString = ConfigurationManager.ConnectionStrings["SocialSiteConnectionString"].ConnectionString;
      }
      ...
    }

Теперь, во всем вашем коде, просто откройте его, используя:

SqlConnection conn = new SqlConnection(Global.ConnectionString);

Еще лучше, создайте класс, в котором скрыта «сантехника». Чтобы выполнить тот же запрос в моем коде, я просто введите:

        using (BSDIQuery qry = new BSDIQuery())
        {
            SqlDataReader nwReader = qry.Command("SELECT...").ReturnReader();
            // If I needed to add a parameter I'd add it above as well: .ParamVal("CurrentUser")
            while (nwReader.Read())
            {
                int UserID = (int)nwReader["UserID"];
                // Do something with UserID here...
            }
            nwReader.Close();
        }

Это просто пример использования my DAL. Тем не менее, обратите внимание, что нет строки подключения, нет команд или объектов подключения, которые создаются или управляются, просто «BSDIQuery» (который делает много разных вещей в дополнение к показанному). Ваш подход будет отличаться в зависимости от задач, которые вы выполняете чаще всего.

3 голосов
/ 01 апреля 2009

Большую часть времени я использую это (обратите внимание, что я также использую подход пула соединений):

    public DataTable ExecuteQueryTable(string query)
    {
        return ExecuteQueryTable(query, null);
    }

    public DataTable ExecuteQueryTable(string query, Dictionary<string, object> parameters)
    {
        using (SqlConnection conn = new SqlConnection(this.connectionString))
        {
            conn.Open();

            using (SqlCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText = query;

                if (parameters != null)
                {
                    foreach (string parameter in parameters.Keys)
                    {
                        cmd.Parameters.AddWithValue(parameter, parameters[parameter]);
                    }
                }

                DataTable tbl = new DataTable();
                using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                {
                    da.Fill(tbl);
                }

                return tbl;
            }
        }
    }
2 голосов
/ 01 апреля 2009

Вот адаптация существующего кода:

String sql = "SELECT [UserId] FROM [UserProfiles] WHERE [UserId] != @CurrentUserId";

string strCon = System.Web
                      .Configuration
                      .WebConfigurationManager
                      .ConnectionStrings["SocialSiteConnectionString"].ConnectionString;

DataTable result = new DataTable();
using (var conn = new SqlConnection(strCon))
using (var cmd = new SqlCommand(sql, conn))
{
    cmd.Parameters.Add("@CurrentUserID", SqlDbType.Int).Value = CurrentUserID;
    conn.Open();

    result.Load(cmd.ExecuteReader());
}
1 голос
/ 01 апреля 2009

Создание SqlCommand не выполняет его вообще.

Команда будет выполнена, когда вы вызовете ExecuteReader или что-то подобное.

Если вы хотите что-то, что будет извлекать все результаты в память, вы должны посмотреть на DataSet / DataTable. Для них есть учебник здесь - или есть множество других в сети, и любая приличная книга ADO.NET также расскажет о них.

Если вы не хотите сразу извлечь их все в память, тогда ExecuteReader это метод для вас. Это вернет SqlDataReader, который похож на курсор базы данных - он читает строку за раз, и вы запрашиваете отдельные столбцы, как вам нужно, вызывая Read для каждый раз переходить на следующий ряд.

0 голосов
/ 01 апреля 2009

В то время как в PHP вы делаете что-то вроде

while ($row = mysql_fetch_array ($result)) 
{
  //this assumes you're doing something with foo in loop
  $foo = $row["userid"];

  //using $foo somehow
}

в .NET, вы делаете что-то другое. Поверьте, исходя из фона PHP, переход с PHP на .NET не прост. Есть много вещей, которые покажутся странными. Хотя через некоторое время это будет иметь смысл! Просто выложи это. Мне лично это нравится больше.

Хорошо ... если у вас есть DataSet, как вы говорите, вы можете сделать что-то вроде этого,

//assuming you have a DataSet called myDataSet
for (int i = 0; i < myDataSet.Tables[0].Rows.Count; i++)
{
  //likewise assuming here you're doing something with foo in loop
  string foo = myDataSet.Tables[0].Rows[i]["userid"].ToString();

  //similarly do something with foo in loop
}

Это то же самое, что и фрагмент PHP.

...