C# 在SQL Server CE中,是否有一种方法可以一次搜索所有表的字段?

C# 在SQL Server CE中,是否有一种方法可以一次搜索所有表的字段?,c#,sql-server-ce,webmatrix,C#,Sql Server Ce,Webmatrix,我希望在使用SQLServerCompact的WebMatrix C.net环境中,有一种方法可以搜索所有表和字段中的值。我有一堆大约100个表,通过WebMatrix连接到,我正试图寻找一个包含我需要的一些信息的表 我来过这里: 在这里,关于stackoverflow: 以及这里: 不幸的是,我没有看到如何在我当前的环境中实现这些方法,但我意识到可能没有真正的方法来实现我所要求的 不管有没有一种方法可以满足我的要求,我至少想知道,这样我就可以寻找另一种方法 谢谢 ---------------

我希望在使用SQLServerCompact的WebMatrix C.net环境中,有一种方法可以搜索所有表和字段中的值。我有一堆大约100个表,通过WebMatrix连接到,我正试图寻找一个包含我需要的一些信息的表

我来过这里:

在这里,关于stackoverflow:

以及这里:

不幸的是,我没有看到如何在我当前的环境中实现这些方法,但我意识到可能没有真正的方法来实现我所要求的

不管有没有一种方法可以满足我的要求,我至少想知道,这样我就可以寻找另一种方法

谢谢

---------------在SQL CE中工作的SQL子查询---------------

从用户配置文件中选择*加入网页\用户角色 在UserProfile.UserID=webpages\u UsersInRoles.UserID上 RoleId 6和电子邮件不在其中 从用户配置文件中选择电子邮件加入网页\u用户角色 在UserProfile.UserID=webpages\u UsersInRoles.UserID上 其中RoleId=6通过电子邮件订购


我不确定CE,但我使用这种方法:


也就是第三个。在使用时阅读并理解语法,它是高度可修改的,可以按数据类型进行过滤。

我已经根据Syn123的答案改编了SQL,以下是我目前所掌握的内容:

SELECT c.TABLE_NAME, c.COLUMN_NAME
FROM   INFORMATION_SCHEMA.COLUMNS AS c 
       INNER JOIN INFORMATION_SCHEMA.Tables AS t ON t.TABLE_NAME = c.TABLE_NAME
WHERE  (c.DATA_TYPE IN ('char', 'nchar', 'varchar', 'nvarchar', 'text', 'ntext')) AND (t.TABLE_TYPE = 'TABLE')
我遇到的问题是,我无法使用SQL CE执行子查询,因此无法从结果集中进行选择。如果您有权访问.MDF数据库文件,则可以编写一个小型控制台应用程序,使用上述SQL返回的集合搜索特定关键字。您需要一种创建动态SQL的方法,而SQL CE不支持EXEC,因此这很困难,而且很可能无法自行实现

编辑:


有一个非常快速和肮脏的控制台应用程序,它将打印出任何包含文本值的表/列。您可以调整它以满足您的需要。我希望这能有所帮助。

您使用的是什么版本的SQL Server CE?如何查找表?你没看到什么?这些链接中的每一个似乎都满足了你的要求;你试过了吗?怎么搞的?SQL CE本身应该可以做你想做的事情,为什么你必须通过WebMatrix?@CameronTinker我希望这能回答你的问题,但如果这有帮助的话,我使用的是WebMatrix 2。我总是使用WebMatrix-用于Web应用,那就是is@CameronTinker我没有真正尝试过,因为我不知道如何查询它们。您能在FROM子句中使用通配符吗?谢谢您的示例,如果这是一个愚蠢的问题,请原谅,但我熟悉sql查询SELECT*FROM。。。哪里诸如此类。在您发布的链接中的示例中,这只是一个sql查询吗?如果是这样的话,里面有一些我以前从未见过的关键词。如果不是,它是什么语言?它是一个MS SQL查询,使用游标在SQL系统表中循环,我相信它可以变得更清晰。我回答的一个大问题是,它在CE中是否有效,如果不行,请告诉我。我很想尝试这种方法,但我不确定我是否了解足够的语法来修改它以用于我的数据库。当然,它不能像复制/粘贴那样简单,是吗?另外,我看到的另一个错误是,我将不被允许创建_表,因为我们从这一端具有只读访问权限。您应该能够创建临时表,所以请遵循并在查询前添加一个。这就像复制粘贴一样简单,然后将您的值放入Sargable,因此您可以使用搜索词替换其中的字符串SELECT Sargable='Beer'这一行。我将用一个我知道可以在web应用程序中定期使用的示例更新我的帖子。我很想看看您是如何使用SQL CE实现子查询的:。我见过一些解决方案使用联接,但对于像您这样大的数据集来说,这确实是低效的。好吧,这是发布的,但可能我过于简化了子查询的含义,因为这是SQL Server非CE的一个示例,我甚至没有为CE修改它。不管怎么说,现在我已经5岁了,我得走了,但我明天早上第一件事就是回到这篇文章,我将在CST 8点上班。再次感谢你,明天见!没问题。很高兴尽我所能提供帮助。我已经更新了我的答案,添加了一个示例控制台应用程序,该应用程序将为任何找到的文本吐出表\列信息。我希望这有帮助。
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlServerCe;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SQLCESearch
{
    class Program
    {
        static void Main(string[] args)
        {
            SearchText("Nancy");
            Console.ReadKey();
        }

        private static void SearchText(string searchText)
        {
            string connStr = "Data Source=Northwind40.sdf;Persist Security Info=False;";
            DataTable dt = new DataTable();
            try
            {
                string sql = "SELECT c.TABLE_NAME, c.COLUMN_NAME ";
                sql += "FROM   INFORMATION_SCHEMA.COLUMNS AS c ";
                sql += "INNER JOIN INFORMATION_SCHEMA.Tables AS t ON t.TABLE_NAME = c.TABLE_NAME ";
                sql += "WHERE  (c.DATA_TYPE IN ('char', 'nchar', 'varchar', 'nvarchar', 'text', 'ntext')) AND (t.TABLE_TYPE = 'TABLE') ";

                SqlCeDataAdapter da = new SqlCeDataAdapter(sql, connStr);
                da.Fill(dt);

                foreach (DataRow dr in dt.Rows)
                {
                    string dynSQL = "SELECT [" + dr["COLUMN_NAME"] + "]";
                    dynSQL += " FROM [" + dr["TABLE_NAME"] + "]";
                    dynSQL += " WHERE [" + dr["COLUMN_NAME"] + "] LIKE '%" + searchText + "%'";

                    DataTable result = new DataTable();
                    da = new SqlCeDataAdapter(dynSQL, connStr);
                    da.Fill(result);
                    foreach (DataRow r in result.Rows)
                    {
                        Console.WriteLine("Table Name: " + dr["TABLE_NAME"]);
                        Console.WriteLine("Column Name: " + dr["COLUMN_NAME"]);
                        Console.WriteLine("Value: " + r[0]);
                    }
                }
            }
            catch (Exception e)
            {
                Console.Write(e.Message);
            }


        }
    }
}