C# C-如何声明一个变量,该变量将由if语句中的数据库调用填充?

C# C-如何声明一个变量,该变量将由if语句中的数据库调用填充?,c#,webmatrix,C#,Webmatrix,我希望从if语句内部的数据库调用中获取数据,然后我希望能够在稍后的页面中处理if语句外部的数据 那么,为什么这不起作用呢?我能做些什么来让它工作呢?我刚刚收到错误消息编译器错误消息:CS0103:名称“selectedData”在当前上下文中不存在。我试图在if语句之外声明一个selectedData变量,这样它就可以使用了,但我似乎不知道如何正确地执行该操作 @{ var testVariable = "blah"; //set cache key and query ba

我希望从if语句内部的数据库调用中获取数据,然后我希望能够在稍后的页面中处理if语句外部的数据

那么,为什么这不起作用呢?我能做些什么来让它工作呢?我刚刚收到错误消息编译器错误消息:CS0103:名称“selectedData”在当前上下文中不存在。我试图在if语句之外声明一个selectedData变量,这样它就可以使用了,但我似乎不知道如何正确地执行该操作

@{

    var testVariable = "blah";

    //set cache key and query based their being a craft name
    if(testVariable.Length > 0){

        var db = Database.Open("Connection"); 
        var selectedData = db.Query("SELECT * FROM Products");             
    } 

}


<div>
    @foreach (var row in selectedData){
        @row.ContentTitle <br />
        @row.ContentShortDescription <br />
    } 
</div>

这是一个范围问题。您需要在if范围之外声明变量

@{

    var testVariable = "blah";
    Type selectedData;

    //set cache key and query based their being a craft name
    if(testVariable.Length > 0){

        var db = Database.Open("Connection"); 
        selectedData = db.Query("SELECT * FROM Products");             
    } 

}


<div>
    @foreach (var row in selectedData){
        @row.ContentTitle <br />
        @row.ContentShortDescription <br />
    } 
</div>

我对这里的字体不熟悉,所以我用了这个字体。在那里替换合适的类型。请注意,此代码段也不能确保在进入循环之前正确设置selectedData。你也应该处理这个问题。

这是一个关于范围的问题

基本上,在C语言中,当您打开一个新的{}集合时,您将声明一个新的作用域。在该范围内创建的变量在退出时将被销毁。这是一个相当简单的解释,不完全准确,但很容易理解

{
    var testVariable = "blah";

    //set cache key and query based their being a craft name
    if(testVariable.Length > 0)
    {

        var db = Database.Open("Connection"); 
        // Create a new variable.
        var selectedData = db.Query("SELECT * FROM Products");          
    } 
    // Variable doesn't exist anymore.
}
要解决此问题,请执行以下操作:

{
    var testVariable = "blah";
    // Create variable outside the if scope
    var selectedData = null; // Won't compile, compiler cannot find valid variable type.

    //set cache key and query based their being a craft name
    if(testVariable.Length > 0)
    {

        var db = Database.Open("Connection"); 
        // Assign a value to a variable
        selectedData = db.Query("SELECT * FROM Products");          
    } 
    // Variable still exist!
}
// Here, variable would cease to exist. :(
但是在这里,代码不会编译,因为编译器不知道selectedData是什么类型,因为我在创建时将其赋值为null。因此,假设selectedData属于Data类型:


之后,如果选择了Data!=null以知道数据是否被正确查询。

您应该注意,这实际上不会编译。@JordanKaye:很可能。我仍然很难理解为什么人们到处都是垃圾。这只会使跟踪变量类型变得更加困难。这将是错误CS0818-隐式类型的局部变量必须是initialized@LightStriker我同意。我只在for循环变量声明中使用它。但原因是var anything=null不会编译,因为在声明var时需要给它一个类型。@sethflowers:编辑了我的答案以说明为什么它不会编译。我想这就是我的问题所在。我尝试添加var selectedDate=;您在此处添加了行,但随后我收到以下错误编译器错误消息:CS0029:无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“string”。所以我想我不能使用var作为类型,但是它是什么类型呢?这是我在帖子中提到的。。使用db.Query返回的类型。我不知道那是什么。查看文档。尝试使用IEnumerable selectedData=null@GmG-谢谢!这正是我所需要的,而且我成功了!谢谢大家帮助我理解!
{
    var testVariable = "blah";
    // Create variable outside the if scope
    Data selectedData = null; // Now it compiles. :)

    //set cache key and query based their being a craft name
    if(testVariable.Length > 0)
    {

        var db = Database.Open("Connection"); 
        // Assign a value to a variable
        selectedData = db.Query("SELECT * FROM Products");          
    } 
    // Variable still exist!
}
// Here, variable would cease to exist. :(