无法将检索到的数据从一个查询用于另一个查询?

时间:2018-05-08 19:48:51

标签: sql asp.net

我需要使用一个变量(edifcodigo),从一个查询中检索分配值,通过使用其他查询将其插入表中,但是有一个错误表明此变量在实际上下文中不可用。我是aspnet的新手,有谁知道如何解决这个问题?

这是我的代码:

//Connect to db
string connetionString = @"myconexionstring";
string sql = "SELECT TOP 1 id_proyecto AS codigo FROM DNN_SCO_PROY_CO_PROYECTO_TBL WHERE nombre_proyecto= '"+ uedif +"'";

//find building code by querying the database
try
{
    using (SqlConnection conexion = new SqlConnection(connetionString))
    {
        conexion.Open();
        using (SqlCommand query = new SqlCommand(sql, conexion))
        {
            SqlDataReader result = query.ExecuteReader();
            while (result.Read())
            {
                string edifcodigo = result["codigo"].ToString();
            }
        }
    }
}
catch (Exception ex)
{
    Response.Write(ex.Message);
}

//Save referer friend
try
{
    using (SqlConnection conn = new SqlConnection(connetionString))
    {
    conn.Open();
        using (SqlCommand cmd = new SqlCommand("DNN_SVI_SCO_DATOS_RECOMIENDA_AMIGO_SP", conn))
        {
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.Add("@DRA_PROYECTO_CLIENTE", System.Data.SqlDbType.VarChar).Value = edifcodigo; ;
        }
    }
}
catch (Exception ex)
{
    Response.Write(ex.Message);
}

3 个答案:

答案 0 :(得分:1)

那是因为你在不同的代码块中声明了变量。每次打开花括号时,都会打开一个新的代码块。每次关闭花括号时,都会关闭当前代码块。每个代码块都有自己的作用域 - 它可以访问在周围代码块中声明的变量,但不能访问在“兄弟”代码块中声明的变量。

另外,请阅读参数化查询以及它们如何保护您免受SQL注入,并相应地更改您的查询。

此外,您不需要关闭两个命令之间的连接,在这种情况下您可以重用单个命令实例。以下是代码的改进版本:

//Connect to db
var connetionString = @"myconexionstring";
var sql = "SELECT TOP 1 id_proyecto AS codigo FROM DNN_SCO_PROY_CO_PROYECTO_TBL WHERE nombre_proyecto = @nombre_proyecto"; 

//find building code by querying the database
try
{
    using (var conexion = new SqlConnection(connetionString))
    {
        conexion.Open();
        using (var cmd = new SqlCommand(sql, conexion))
        {
            cmd.Parameters.Add("@nombre_proyecto", SqlDbType.NVarChar).Value = uedif;
            var edifcodigo = cmd.ExecuteScalar();

            //Save referer friend
            cmd.Parameters.Clear();
            cmd.CommandText = "DNN_SVI_SCO_DATOS_RECOMIENDA_AMIGO_SP";
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.Add("@DRA_PROYECTO_CLIENTE", System.Data.SqlDbType.VarChar).Value = edifcodigo; ;
        }
    }
}
catch (Exception ex)
{
    Response.Write(ex.Message);
}

答案 1 :(得分:0)

你在while循环中声明了字符串变量,一旦你退出while循环它就会失去范围,在上面移动它的声明:

string connetionString = @"myconexionstring";
string sql = "SELECT TOP 1 id_proyecto AS codigo FROM DNN_SCO_PROY_CO_PROYECTO_TBL WHERE nombre_proyecto= '"+ uedif +"'";
string edifcodigo = "";

答案 2 :(得分:0)

您正在尝试使用在另一个范围内声明的变量。 edifcodigo应该在两个try块的父范围内声明。

//Connect to db
string connetionString = @"myconexionstring";
string sql = "SELECT TOP 1 id_proyecto AS codigo FROM DNN_SCO_PROY_CO_PROYECTO_TBL WHERE nombre_proyecto= '"+ uedif +"'";

string edifcodigo="";    // YOU SHOULD DECLARE edifcodigo HERE

并且其他代码将会出现

//find building code by querying the database
try
{
    using (SqlConnection conexion = new SqlConnection(connetionString))
    {
        conexion.Open();
        using (SqlCommand query = new SqlCommand(sql, conexion))
        {
            SqlDataReader result = query.ExecuteReader();
            while (result.Read())
            {
                edifcodigo = result["codigo"].ToString();
            }
        }
    }
}
catch (Exception ex)
{
    Response.Write(ex.Message);
}

//Save referrer friend
try
{
    using (SqlConnection conn = new SqlConnection(connetionString))
    {
        conn.Open();

        using (SqlCommand cmd = new SqlCommand("DNN_SVI_SCO_DATOS_RECOMIENDA_AMIGO_SP", conn))
        {
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.Add("@DRA_PROYECTO_CLIENTE", System.Data.SqlDbType.VarChar).Value = edifcodigo; ;
        }
    }
}
catch (Exception ex)
{
    Response.Write(ex.Message);
}