У меня здесь много кода, потому что я делаю многое другое, но это эволюция. Вот как создать типичную таблицу:
if exists (select * from sysobjects where id = object_id(N'myTable') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE myTable
GO
CREATE TABLE myTable(
myTableID Int Identity(1000,1) PRIMARY KEY NONCLUSTERED
,myTableName varchar(128) default ''
,myTableDesc varchar(max) default ''
,myTableSort Int default 0
)
GO
INSERT INTO myTable(myTableName,myTableSort) VALUES('One',1)
INSERT INTO myTable(myTableName,myTableSort) VALUES('Two',2)
INSERT INTO myTable(myTableName,myTableSort) VALUES('Three',3)
Я использую хранимые процедуры. Вот код SQL:
create schema myTable authorization dbo
-- It might seem odd to create a schema called with the name of the table, but that's how I organize the stored procedures by table name.
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'myTable.[get]') AND type in (N'P', N'PC'))
DROP PROC myTable.[get]
GO
CREATE PROC myTable.[get]
(@UsrID Int
,@RemoteAddr Varchar(15)
,@myTableID Int
) AS
SELECT myTableID,myTableName,myTableDesc,myTableSort
FROM myTable
WHERE myTableID = @myTableID
GO
exec myTable.[get] 0,'',1001
@UsrID - это первый параметр в каждой хранимой процедуре. Это кто хочет знать.
@RemoteAddr - второй параметр в каждой хранимой процедуре. Это IP-адрес пользователя. Теперь я знаю, что это не безупречно, но думаю, что безопасность такова, что 1) @UsrID - это то, что они знают (они должны были знать пароль, чтобы войти в систему как пользователь).
2) @RemoteAddr - это то, чем они владеют (хотя IP-адреса могут быть подделаны).
@myTableID является основным ключом для @myTable. Я всегда называю первичный ключ именем таблицы, за которым следует идентификатор.
Вот типичная .cfm страница:
<cfscript>
</cfscript>
<cfoutput>
<cfinclude template="/Inc/html.cfm">
<link rel="stylesheet" type="text/css" href="Index.css">
<cfinclude template="/Inc/body.cfm">
<ul>
<li><a class="myClass" data-mytableid="1000" href="JavaScript:;">Click One!</a></li>
<li><a class="myClass" data-mytableid="1001" href="JavaScript:;">Click Two!</a></li>
<li><a class="myClass" data-mytableid="1002" href="JavaScript:;">Click Three!</a></li>
</ul>
<cfinclude template="/Inc/foot.cfm">
<script src="Index.js"></script>
<cfinclude template="/Inc/End.cfm">
</cfoutput>
Сценарий, который я включаю во всех моих страницах:
window.dom = {}
dom.msg = $('#msg')
dom.main = $('main')
dom.fail = function(xhr, status, response) {
dom.msg.text(status + ': ' + response).addClass('label-warning')
dom.main.html(xhr.responseText)
debugger
}
и сценарий для самой страницы:
(function() {
$(document).on('click','.myClass',clicked)
function clicked() {
var local = {}
local.url = 'myTable.cfc'
local.type = 'POST' // or GET
local.dataType = 'json'
local.data = {}
local.data.method = 'get';
local.data.myTableID = $(this).data('mytableid')
local.context = this;
result = $.ajax(local)
result.fail(dom.fail)
result.done(done)
}
function done(response, status, xhr) {
// console.log(response.COLUMNS)
// console.log(response.DATA)
// console.log(response.DATA[0])
// console.log(response.DATA[0][0]) // myTableID
// console.log(response.DATA[0][1]) // myTableName
// console.log(response.DATA[0][2]) // myTableDesc
// console.log(response.DATA[0][3]) // myTableSort
// console.log(status)
// console.log(xhr)
}
})()
Наконец, myTable.cfc:
component {
remote function get(myTableID) returnformat='json' {
storedproc dataSource=session.dataSource
procedure='myTable.[get]' {
procparam cfSqlType='cf_sql_integer' value=session.Usr.UsrID;
procparam cfSqlType='cf_sql_varchar' value=session.RemoteAddr;
procparam cfSqlType='cf_sql_integer' value=arguments.myTableID;
procresult resultset=1 name='result';
}
return result
}
}
И я должен вставить сокращенное приложение.CFC:
component {
this.Name = 'myAJAX'
this.dataSource = 'LR2015Summer1'
this.SessionManagement = true
function onSessionStart() {
session.dataSource = this.dataSource
session.RemoteAddr = getPageContext().getRequest().getRemoteAddr()
session.Usr = {}
session.Usr.UsrID = 0
}
function onRequestStart(LogCFCName) {
setting showDebugOutput=false;
if (isDefined('url.onSessionStart')) {
onSessionStart()
}
request.msg = ''
request.mod = 'label-info'
request.title='How I AJAX and return a query'
request.home = '/HowIWrite/AJAX/cfc'
request.css = url.css ?: true
request.js = url.js ?: true
request.bootstrap = url.bootstrap ?: true
request.bootstrap_theme = 'bootstrap-theme'
request.tryCatch = url.tryCatch ?: false
request.navbar = url.navbar ?: true
request.container = url.container ?: true
request.GoogleMaterialdesign = url.GoogleMaterialdesign ?: true
request.jQueryUI = url.jQueryUI ?: false
request.jQueryUI_theme = 'ui-lightness' // black-tie,blitzer,cupertino,dark-hive,dot-luv,eggplant,excite-bike,flick,hot-sneaks,humanity,le-frog,mint-choc,overcast,pepper-grinder,redmond,smoothness,south-street,start,sunny,swanky-purse,trontastic,ui-darkness,ui-lightness,vader
request.cgiName = getPageContext().getRequest().getServletPath()
request.cgiName = Left(request.cgiName,Len(request.cgiName)-4)
request.cgiName = ListLast(request.cgiName,'/')
request.cssName = request.cgiName & '.css'
request.jsName = request.cgiName & '.js'
}
}
В вашем вызове AJAX попробуйте 'cfcs/taxdata.cfc? Method = getSalesTax & ReturnFormat = json' – Chester
Это сработало. Благодарю. –
Легкий способ - не использовать ajax вообще. Запустите функцию в вашем файле .cfm и используйте атрибут value вашего тега cfinput. Не связано с вашим вопросом, но вам не нужен тег cfoutput в вашей функции. cfquery имеет один встроенный. –