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