- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章在ASP.NET 2.0中操作数据之六十七:在TableAdapters中使用JOINs由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
导言:
在关系数据库里,我们处理的数据通常跨越了几个数据表。举例:当展示产品信息时我们很可能想列出每个产品相应的category以及供应商的名称等.诚然,Products表里包含有CategoryID 和SupplierID值,但是事实上的category以及supplier names分别定义在Categories表和Suppliers表里. 要从其它的相关表里获取信息,我们可以使用correlated subqueries或JOINs.一条correlated subquerie就是一个镶套的SELECT,引用外部查询(outer query)的列.比如在第一章《创建一个数据访问层》里我们在ProductsTableAdapter的主查询里使用2条correlated subqueries来返回每个产品的category 以及supplier names.而JOIN是一SQL构造,将2个不同的表的相关联的rows进行合并.在第46章《使用SqlDataSource控件检索数据》里,我们使用JOIN来显示每个产品的category信息. 。
我们避免在TableAdapters里使用JOIN是由于TableAdapter向导自动生成的INSERT, UPDATE,以及DELETE statements有其局限性.具体来说,如果TableAdapter的主查询里包含了任何的JOIN,那么TableAdapter就不能为它的InsertCommand, UpdateCommand,以及DeleteCommand属性自动地创建 ad-hoc SQL statements或存储过程.在开始之前,我们先简要地对correlated subqueries和JOIN进行比较. 。
比较Correlated Subqueries和JOINs 。
我们知道在第一章的Northwind DataSet数据集里创建的ProductsTableAdapter使用correlated subqueries来返回每个产品对应的category 和 supplier name。该ProductsTableAdapter的主查询如下:
1
2
3
4
5
6
7
8
|
SELECT
ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued,
(
SELECT
CategoryName
FROM
Categories
WHERE
Categories.CategoryID =
Products.CategoryID)
as
CategoryName,
(
SELECT
CompanyName
FROM
Suppliers
WHERE
Suppliers.SupplierID =
Products.SupplierID)
as
SupplierName
FROM
Products
|
我们注意这2个correlated subqueries——“(SELECT CategoryName FROM Categories WHERE Categories.CategoryID = Products.CategoryID)” 以及“(SELECT CompanyName FROM Suppliers WHERE Suppliers.SupplierID = Products.SupplierID),都是一个SELECT查询,返回一个单一值,并作为外部SELECT statement的额外的列. 。
此外,我们可以使用JOIN来返回每个产品的supplier 以及category name,下面的查询与上面的代码效果一样,不过用的是JOIN:
1
2
3
4
5
6
7
8
9
10
|
SELECT
ProductID, ProductName, Products.SupplierID, Products.CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued,
Categories.CategoryName,
Suppliers.CompanyName
as
SupplierName
FROM
Products
LEFT
JOIN
Categories
ON
Categories.CategoryID = Products.CategoryID
LEFT
JOIN
Suppliers
ON
Suppliers.SupplierID = Products.SupplierID
|
JOIN基于某种标准将一个表的记录与另一个表的记录合并起来.比如上述代码中,“LEFT JOIN Categories ON Categories.CategoryID = Products.CategoryID”就指示SQL Server将每一条product记录与category记录合并起来,标准是category记录的CategoryID值与product记录CategoryID值相吻合.在合并的结果里,我们可以对每个产品相应的category fields进行处理(比如CategoryName). 。
注意:JOIN通常用来从相关的数据库查询数据.如果你对JOIN语法比较陌生或者对其用法复习提高,我推荐你阅读W3 Schools论坛上的文章《SQL Join tutorial》(http://www.w3schools.com/sql/sql_join.asp);此外你还可以阅读SQL Books Online的《JOIN Fundamentals》和《Subquery Fundamentals》部分. 。
当使用类型化的数据集(Typed DataSets)来构建数据访问层时,使用correlated subqueries要好一些。具体来说,如果主查询里包含任何的JOIN时,TableAdapter的设置向导就不会自动生成相应的INSERT, UPDATE, 以及DELETE statements.相反,使用correlated subqueries的话就可以. 。
为验证这一点,我们在~/App_Code/DAL文件夹里创建一个临时的类型化的数据集.在TableAdapter设置向导里选择使用ad-hoc SQL statements,并键入如下的SELECT查询(如图1):
1
2
3
4
5
6
7
8
9
10
|
SELECT
ProductID, ProductName, Products.SupplierID, Products.CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued,
Categories.CategoryName,
Suppliers.CompanyName
as
SupplierName
FROM
Products
LEFT
JOIN
Categories
ON
Categories.CategoryID = Products.CategoryID
LEFT
JOIN
Suppliers
ON
Suppliers.SupplierID = Products.SupplierID
|
图1:键入一个包含JOIN的主查询 。
默认情况下,TableAdapter在主查询的基础上自动地创建INSERT, UPDATE, 以及DELETE statements.如果你点击“Advanced”按钮的话,你将看到该功能是激活的.不理会这些设置的话,TableAdapter将不能创建INSERT, UPDATE,以及DELETE statements因为主查询包含了JOIN. 。
图2:键入一个包含JOIN的主查询 。
点Finish完成向导。此时在DataSet设计器里将只包含一个TableAdapter,其包含的DataTable列出了SELECT查询返回的列.包括CategoryName 和 SupplierName,如图3所示. 。
图3:DataTable包含了返回的列 。
此外,TableAdapter的InsertCommand, UpdateCommand, 和DeleteCommand属性为空。你可以在设计器里选中TableAdapter,查看属性窗口.你将看到InsertCommand, UpdateCommand, 和DeleteCommand属性设置为“(None)”. 。
图4: InsertCommand, UpdateCommand,DeleteCommand属性为“(None)” 。
为了验证该缺点,我们可以通过属性窗口为InsertCommand, UpdateCommand,以及 DeleteCommand属性手动写入SQL statements以及参数.最开始我们可以设置TableAdapter的主查询不包含任何JOIN,这将允许自动生成INSERT, UPDATE,以及DELETE statements.完成向导设置后,我们可以通过属性窗口手动修改TableAdapter的SelectCommand以包含JOIN语法. 。
虽然这种方法工作正常,但很脆弱.因为我们可以在任何时候通过向导设置重新设置主查询,重新自动生成INSERT, UPDATE,以及DELETE statements.这意味着我们刚刚进行的用户定制可以很容易地就被丢失了. 。
好在TableAdapter自动生成的INSERT, UPDATE,以及DELETE statements的脆弱性仅仅针对ad-hoc SQL statements而言.如果你的TableAdapter使用的是存储过程的话,你可以自定义SelectCommand, InsertCommand, UpdateCommand,或DeleteCommand存储过程.重新运行TableAdapter设置向导时不用担心存储过程会被修改. 。
在接下来的几个步骤里我们将创建一个TableAdapter,最初我们使用一个不含JOIN的主查询,以便自动生成相应的insert, update,和delete存储过程.接着,我们将更新该SelectCommand以使用JOIN来从相关表返回额外的列. 最后,我们将创建一个对应的Business Logic Layer class类,在ASP.NET页面上使用该TableAdapter. 。
第1步:使用简单的主查询创建一个TableAdapter 。
在本文,我们将为NorthwindWithSprocs DataSet数据集的Employees表添加一个TableAdapter以及一个强类型的DataTable.该Employees表包含一个ReportsTo列,它指定了该雇员的经理的EmployeeID值.比如:雇员Anne Dodsworth的ReportTo值为5,也就是Steven Buchanan的EmployeeID值.因此,雇员Anne Dodsworth的经理就是Steven Buchanan.除了返回每个雇员的ReportsTo值外,我们也想返回他们经理的名字.为此,我们可以使用JOIN.但是我们知道,在最初创建TableAdapter时使用JOIN的话向导将不能够自动生成相应的insert, update,delete属性. 因此,我们在最初创建 TableAdapter的时候不在其主查询里包含任何的JOIN.在第2步里,我们将对主查询存储过程进行更新,通过使用JOIN来获取经理的名字. 。
我们打开~/App_Code/DAL文件夹里的NorthwindWithSprocs DataSet数据集.在设计器里单击右键,选择“Add”项,再选" TableAdapter",这将打开TableAdapter设置向导.如图5所示,让向导创建一个新的存储过程,再点Next.具体的相关细节请参阅第65章《在TableAdapters中创建新的存储过程》 。
图5:选择“Create new stored procedures”项 。
该TableAdapter的主查询的SELECT statement如下:
1
2
|
SELECT
EmployeeID, LastName, FirstName, Title, HireDate, ReportsTo, Country
FROM
Employees
|
由于该查询没有包含任何的JOIN,因此TableAdapter向导将用相应的INSERT, UPDATE, DELETE statements来创建存储过程. 。
接下来向导要我们为存储过程命名。用Employees_Select, Employees_Insert, Employees_Update, and Employees_Delete来命名,如图6所示.
图6:对TableAdapter的存储过程命名 。
最后向导要我们为TableAdapter的方法命名,我们命名为Fill 和 GetEmployees.同时选中“Create methods to send updates directly to the database (GenerateDBDirectMethods)”选项. 。
图7:将TableAdapter的方法命名为Fill和GetEmployees 。
完成设置后,花点时间检查数据库里的存储过程,你可以看到4个新的存储过程:Employees_Select, Employees_Insert, Employees_Update,Employees_Delete.接下来,考察我们刚刚创建创建的EmployeesDataTable 和 EmployeesTableAdapter.该DataTable包含了主查询返回的每列。选中TableAdapter并进入属性窗口,你将看到InsertCommand, UpdateCommand,DeleteCommand属性调用相应的存储过程. 。
图8:TableAdapter包含Insert, Update,Delete属性 。
当自动的生成insert, update,delete存储过程,并恰当的设置好InsertCommand, UpdateCommand,DeleteCommand属性后我们就可以对SelectCommand的存储过程进行用户定制,以返回雇员的经理这些信息.具体来说,我们需要更新Employees_Select存储过程,使用JOIN返回经理的FirstName 和 LastName值。完成后,我们要更新DataTable以使其包含这些额外的列.我们将在第2和3步实现. 。
第2步:用JOIN定制存储过程 。
在服务器资源管理器里,展开Northwind数据库的存储过程文件夹,打开存储过程Employees_Select。如果你没有找到该存储过程,右击存储过程文件夹选“刷新”.更新该存储过程,以使其用一个LEFT JOIN来返回经理的first 和last name:
1
2
3
4
5
6
7
8
9
10
|
SELECT
Employees.EmployeeID, Employees.LastName,
Employees.FirstName, Employees.Title,
Employees.HireDate, Employees.ReportsTo,
Employees.Country,
Manager.FirstName
as
ManagerFirstName,
Manager.LastName
as
ManagerLastName
FROM
Employees
LEFT
JOIN
Employees
AS
Manager
ON
Employees.ReportsTo = Manager.EmployeeID
|
完成对SELECT statement的更新后,在“文件”菜单里选“Save Employees_Select”来保存所做的修改. 当然,你也可以点击工具栏的保存图标或按下Ctrl+S键.保存后,在服务器资源管理器里右击存储过程Employees_Select,选“执行”。这将执行存储过程并在输出窗口里显示结果,如图9所示.
图9:存储过程的结果显示在输出窗口里 。
第3步:更新DataTable的列 。
此时,Employees_Select存储过程返回ManagerFirstName 和ManagerLastName值。但在EmployeesDataTable里并不包含这2列.可以通过下面的方法来进行添加:
.手动——在设计器里右键单击DataTable,在“Add”菜单里选“Column”.然后对列命名并设置其属性. 。
.自动——TableAdapter设置向导会更新DataTable的列以映射SelectCommand存储过程返回的列(field).如果使用的是ad-hoc SQL statements的话,向导会移除InsertCommand, UpdateCommand,以及 DeleteCommand属性,因为SelectCommand现在包含了一个JOIN. 但若使用存储过程的话,这些command属性将依然存在. 。
我们在前面的第35章《使用Repeater和DataList单页面实现主/从报表》以及第52章《使用FileUpload上传文件》里考察过手动添加列的情况,我们在以后的文章里也会看到该过程的更多的细节,不过在本文,我们通过使用TableAdapter设置向导来自动添加. 。
右键单击EmployeesTableAdapter,并选择“配置”。这将开启TableAdapter设置向导,它列出了用于select, insert, updat,delet的存储过程,同时还有其返回的值和参数(如果有的话).如图10所示,我们可以看到Employees_Select存储过程现在返回了ManagerFirstName 和 ManagerLastName列 。
图10:向导显示了Employees_Select存储过程更新后的列 。
点Finish完成设置,回到DataSet设计器里,该EmployeesDataTable现在包含了2个新添的列ManagerFirstName 和 ManagerLastName. 。
图11:该EmployeesDataTable现在包含了2个新列 。
为了验证更新后的Employees_Select存储过程是否起作用,以及该TableAdapter的insert, update,delete功能,我们要创建一个web页面来允许用户查看并删除employees.不过在此之前,我们要先在业务逻辑层里创建一个新类来处理NorthwindWithSprocs DataSet数据集里的employees.在第4步,我们将创建一个EmployeesBLLWithSprocs class类,在第5步,我们将在一个ASP.NET页面里使用该类. 。
第4步:更新Business Logic Layer 。
在~/App_Code/BLL文件夹里创建一个名为EmployeesBLLWithSprocs.cs的类文件.该类文件与现有的EmployeesBLL class类文件差不多,只是方法要少一些,且使用的是NorthwindWithSprocs DataSet数据集(而不是Northwind DataSet数据集)。在EmployeesBLLWithSprocs类里添加如下的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
using
System;
using
System.Data;
using
System.Configuration;
using
System.Web;
using
System.Web.Security;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.WebControls.WebParts;
using
System.Web.UI.HtmlControls;
using
NorthwindWithSprocsTableAdapters;
[System.ComponentModel.DataObject]
public
class
EmployeesBLLWithSprocs
{
private
EmployeesTableAdapter _employeesAdapter =
null
;
protected
EmployeesTableAdapter Adapter
{
get
{
if
(_employeesAdapter ==
null
)
_employeesAdapter =
new
EmployeesTableAdapter();
return
_employeesAdapter;
}
}
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select,
true
)]
public
NorthwindWithSprocs.EmployeesDataTable GetEmployees()
{
return
Adapter.GetEmployees();
}
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Delete,
true
)]
public
bool
DeleteEmployee(
int
employeeID)
{
int
rowsAffected = Adapter.Delete(employeeID);
// Return true if precisely one row was deleted, otherwise false
return
rowsAffected == 1;
}
}
|
该EmployeesBLLWithSprocs class类的Adapter属性返回NorthwindWithSprocs DataSet数据集的EmployeesTableAdapter的一个实例,类里面的GetEmployees 和DeleteEmployee方法将要用到该属性.其中,GetEmployees方法调用EmployeesTableAdapter对应的GetEmploye方法,其又再调用Employees_Select存储过程并将结果传递给一个EmployeeDataTable;而DeleteEmployee方法仅仅调用EmployeesTableAdapter的Delete方法,该Delete方法调用Employees_Delete存储过程. 。
第5步:在表现层处理数据 。
添加完EmployeesBLLWithSprocs class类后,我们将在一个ASP.NET页面里处理 employee数据。打开AdvancedDAL文件夹里的JOINs.aspx页面,从工具箱里拖一个GridView控件到页面,设其ID值为Employees.接下来,从其智能标签里绑定到一个名为EmployeesDataSource的新的ObjectDataSource控件.设置该ObjectDataSource控件使用EmployeesBLLWithSprocs class类,在SELECT 和 DELETE标签里分别选择GetEmployees 和 DeleteEmployee方法. 点Finish完成设置. 。
图12:设置该ObjectDataSource使用EmployeesBLLWithSprocs Class类 。
图13:设置该ObjectDataSource调用GetEmployees 和 DeleteEmployee方法 。
Visual Studio会为EmployeesDataTable里的每列添加一个BoundField。将Title, LastName, FirstName, ManagerFirstName,和ManagerLastName之外的列全部删除。并分别将这几个列的HeaderText属性重命名为“Last Name”, “First Name”, “Manager's First Name”, “Manager's Last Name” . 。
为了让用户可以在页面删除employees,我们要做2件事情.首先启用GridView的删除功能,然后将ObjectDataSource控件的OldValuesParameterFormatString属性设置为默认值{0}。完成这些后,GridView 和 ObjectDataSource控件的声明代码看起来应该和下面的差不多:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<asp:GridView ID=
"Employees"
runat=
"server"
AutoGenerateColumns=
"False"
DataKeyNames=
"EmployeeID"
DataSourceID=
"EmployeesDataSource"
>
<Columns>
<asp:CommandField ShowDeleteButton=
"True"
/>
<asp:BoundField DataField=
"Title"
HeaderText=
"Title"
SortExpression=
"Title"
/>
<asp:BoundField DataField=
"LastName"
HeaderText=
"Last Name"
SortExpression=
"LastName"
/>
<asp:BoundField DataField=
"FirstName"
HeaderText=
"First Name"
SortExpression=
"FirstName"
/>
<asp:BoundField DataField=
"ManagerFirstName"
HeaderText=
"Manager's First Name"
SortExpression=
"ManagerFirstName"
/>
<asp:BoundField DataField=
"ManagerLastName"
HeaderText=
"Manager's Last Name"
SortExpression=
"ManagerLastName"
/>
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID=
"EmployeesDataSource"
runat=
"server"
DeleteMethod=
"DeleteEmployee"
OldValuesParameterFormatString=
"{0}"
SelectMethod=
"GetEmployees"
TypeName=
"EmployeesBLLWithSprocs"
>
<DeleteParameters>
<asp:Parameter Name=
"employeeID"
Type=
"Int32"
/>
</DeleteParameters>
</asp:ObjectDataSource>
|
在浏览器里测试该页面,如图14所示,该页面列出了每一个employee以及他们的经理的名字. 。
图14:Employees_Select存储过程使用JOIN返回经理的名字 。
点击Delete按钮将触发deleting流程,直到执行Employees_Delete存储过程才结束,但是存储过程里的DELETE statement执行失败,原因是有外键约束(如图15所示)。因为每个employee在Orders表里都有一条到多条记录,才导致删除操作失败. 。
图15:删除操作违背外键约束 。
如果要删除操作执行成功,你要:
.更新外键约束 .对你要删除的employee(s),在Orders表里删除对应的记录 .更新Employees_Delete存储过程,使其在删除Employees记录之前,先删除Orders表里对应的记录.我们在第66章《在TableAdapters中使用现有的存储过程》里探讨过这个问题. 。
我将此作为练习留给读者 。
总结:
当处理关系型数据库时,我们通常要从多个不同的但又相关的表获取数据。Correlated subqueries 和 JOIN提供了两种从关系表访问数据的方法.在以前的文章里使用的是correlated subqueries,因为如果使用JOIN的话TableAdapter将不能自动生成INSERT, UPDATE,DELETE statements,不过我们可以通过手工添加.如果使用ad-hoc SQL statements的话,任何用户定制都可能被TableAdapter设置向导所做的改动所覆盖. 。
幸运的是,用存储过程构建的TableAdapters不像用ad-hoc SQL statements构建的TableAdapters那样易受影响.因此,当用存储过程构建TableAdapter时,在主查询里使用JOIN是可行的.在本文,我们考察了如何创建这种TableAdapter.最开始我们在TableAdapter的主查询里使用不带JOIN的SELECT查询,以便自动生成相应的insert, update,delete存储过程. 然后我们对SelectCommand存储过程进行扩充以使用一个JOIN,并重新运行TableAdapter设置向导来更新EmployeesDataTable的列. 。
重新运行TableAdapter设置向导将自动更新EmployeesDataTable的列以映射Employees_Select存储过程返回的列.当然我们也可以向DataTable手动添加这些列,这是我们下一章要考察的内容. 。
祝编程快乐! 。
作者简介 。
本系列教程作者 Scott Mitchell,著有六本ASP/ASP.NET方面的书,是4GuysFromRolla.com的创始人,自1998年以来一直应用 微软Web技术。希望对大家的学习ASP.NET有所帮助.
最后此篇关于在ASP.NET 2.0中操作数据之六十七:在TableAdapters中使用JOINs的文章就讲到这里了,如果你想了解更多关于在ASP.NET 2.0中操作数据之六十七:在TableAdapters中使用JOINs的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!