Объединить 2 запроса SQL в один запрос и преобразовать в C # - PullRequest
1 голос
/ 15 июля 2011

Мне нужно объединить эти два отдельных запроса в один, потому что это неэффективно И преобразовать это в C # ASP.NET из Classic ASP

SQL = "SELECT MemID FROM network WHERE userid='"&strTemp&"'"
Set rsNet = Conn.Execute(SQL)
if NOT rsNet.eof then
strList = rsNet("memID")
end if
rsNet.close
set rsNet = Nothing

SQL = "SELECT Distinct userid, username, img1, birthday, gendid, city, state, country, title FROM UserInfo WHERE (userinfo.userid IN (" & strList & ")) "
Set rsView = Server.CreateObject("ADODB.Recordset")
rsView.Open SQL, Conn, adOpenKeyset, adLockReadOnly
if NOT rsView.EOF then
arrN = rsView.getrows()
end if
rsView.close
set rsview = nothing

Ответы [ 5 ]

0 голосов
/ 15 июля 2011

Это не так тривиально, как думают другие ответы, потому что похоже, что MemId - это строковое поле с разделителями-запятыми (плохой дизайн базы данных). Следовательно, вы должны использовать динамический SQL внутри ... динамического SQL.

using (SqlConnection conn = new SqlConnection(@"ConnectionStringHere"))
{
    conn.Open();

    IDbCommand cmd = conn.CreateCommand();

    cmd.CommandText = @"
        DECLARE @sql nvarchar(MAX)

        SET @sql = '
            SELECT DISTINCT
                userid, username, img1, birthday,
                            gendid, city, state, country, title 
                FROM UserInfo 
                WHERE UserId IN 
                (' + (SELECT MemID FROM network WHERE UserId = @userId) + ')'

        EXEC(@sql)";

    IDbDataParameter param = cmd.CreateParameter();
    param.DbType = DbType.String;
    param.Value = "12345"; // TODO
    param.ParameterName = "@userId";

    cmd.Parameters.Add(param);

    IDataReader dr = null;

    try
    {
        dr = cmd.ExecuteReader();

        // TODO: Process result set
    }
    finally
    {
        if (dr != null)
            dr.Close();
    }
}
0 голосов
/ 15 июля 2011

Попробуйте это (я включаю операторы использования в случае, если вы не знакомы с правами на использование для ADO.NET):

using System.Data;
using System.Data.SqlClient

public DataTable GetUserDetails(int userID)
{
    DataTable dTable = new DataTable();

    using (SqlConnection con = new SqlConnection(<your connection string>))
    {

        con.Open();

        SqlCommand cmd = new SqlCommand();

        cmd.Parameters.Add(new SqlParameter("@userid", userID);
        cmd.Text = "SELECT DISTINCT u.userid, u.username, u.img1, u.birthday, u.genid, u.city, u.state, u.country, u.title FROM UserInfo u JOIN Network n ON u.userid = n.userid WHERE n.userid = ?";
        cmd.CommandType = CommandType.Text;
        cmd.Connection = con;

        SqlDataAdapter da = new SqlDataAdapter(cmd);        

        da.Fill(dTable);
    }

    return dTable;
}
0 голосов
/ 15 июля 2011
DataTable dtTable = null;
using (SqlConnection oConn = new SqlConnection("Your connection string"))
{
   string strQuery = @"SELECT Distinct userid, username, img1, birthday, gendid, city, state, country, title 
   FROM UserInfo 
   WHERE userinfo.userid IN 
   (
      SELECT MemID 
      FROM network
      WHERE userid= @userid 
    )";
   SqlDataAdapter oDataAdapter = new SqlDataAdapter(strQuery, oConn);
   oDataAdapter.Fill(dtTable, "TableName");

}
0 голосов
/ 15 июля 2011

@ Выбор X-Zero хорош - во-первых, параметром будет @uinputUserID, а не: inputUserId, если вы используете microsoft (sql-server).

В противном случае, преобразование этогоasp.net (с использованием c #) зависит от того, какой элемент управления вы хотите использовать - набор данных, набор данных, источник данных, хранилище данных и т. д. @ Таблица данных г-на - хороший способ, но тогда вам потребуется привязать данныеэто какому-либо элементу управления, использующему его.

0 голосов
/ 15 июля 2011

Я не знаю о C #, но SQL переходит в классическое объединение ...

SELECT userid, username, img1, birthday, gendid, city, state, country, title
FROM UserInfo
JOIN network
ON network.MemID = userinfo.userid
AND network.userid = :inputUserId

Вам нужен DISTINCT, только если по какой-то причине у вас есть неуникальные строки.

...