|
Introduction to Transact-SQL Functions |
|
|
A function is like a method in C#, except that a
function does not belong to a class. As seen in C#, a function is a
relatively small task that should be performed aside but can be accessed any
time to give a result. In Transact-SQL, a function is considered an object.
Based on this, you must create a function and execute it before using it.
The function then becomes part of a database.
|
Practical
Learning: Introducing Functions
|
|
- Start Microsoft Visual Studio
- Create a Windows Forms Application named
TriStateUtilityCompany1
- Design the form as follows:
|
Control |
Text |
Name |
Other Properties |
Label |
Customer Name |
|
|
TextBox |
|
txtCustomerName |
|
Label |
Counter: ___________ |
|
|
Label |
Last Month: |
|
|
TextBox |
|
txtLastMonth |
TextAlign: Right |
Label |
This Month: |
|
|
TextBox |
|
txtThisMonth |
TextAlign: Right |
Label |
Consumption: |
|
|
TextBox |
|
txtConsumption |
TextAlign: Right |
Button |
Evaluate |
btnEvaluate |
|
Label |
Invoice: ___________ |
|
|
Label |
Amount Due: |
|
|
TextBox |
|
txtAmountDue |
TextAlign: Right |
Label |
Database: _________ |
|
|
Button |
Database |
btnDatabase |
|
Button |
Close |
btnClose |
|
|
- Double-click the Database button and implement its event as follows:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace TriStateUtilityCompany1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnDatabase_Click(object sender, EventArgs e)
{
string strConnection =
"Data Source=(local);Integrated Security=yes";
using (SqlConnection connection =
new SqlConnection(strConnection))
{
SqlCommand command =
new SqlCommand("CREATE DATABASE UtilityCompany1;",
connection);
connection.Open();
command.ExecuteNonQuery();
MessageBox.Show("A database named \"UtilityCompany1\" has been created.");
}
}
}
}
- Return to the form and double-click the Close button
- Implement the event as follows:
private void btnClose_Click(object sender, EventArgs e)
{
Close();
}
- Execute the application
- Click the Database button
- Close the form and return to your programming environment
Function Creation Fundamentals
|
|
There are various ways you can create a function:
- In the Server Explorer, expand the connection to the database that
will own the function. Right-click Functions, position the mouse on Add
New, and click Scalar-Valued Function:
- You can open a new empty query window and start typing your code in
it
- Write the code of a function and pass it to a command
In Transact-SQL, the primary formula of creating a
function is:
CREATE FUNCTION FunctionName()
We mentioned already that, in SQL, a function was
created as an object. As such, it must have a name. In our lessons, here are
the rules we will use to name our functions:
- The name of a function will resemble an action. An example is
calculate
- A name will start with either an underscore or a letter. Examples
are _n, act, or Perform
- After the first character as an underscore or a letter, the name
will have combinations of underscores, letters, and digits. Examples are
_n24 or act_52_t
- A name will not include special characters such as !, @, #, $, %, ^,
&, or *
- We will avoid using spaces in a name
- If the name is a combination of words, each word will start in
uppercase. Examples are DoSomething,
_CreateStudentsRecords, Get_Age, or _Calculate_Volume_Area
Returning a Value From a Function
|
|
Like a method in C#, a function can return or produce a
result. When creating a function, you must specify the type of value it must
return. To provide this information, after the name of the function, type
the RETURNS keyword followed by a definition for a data type. Here is
a simple example:
CREATE FUNCTION Addition()
RETURNS Decimal(6,3)
After specifying the type of value the function would
return, you can create a body for the function. While in C# the body of a
function starts with {, in SQL, the body starts with the BEGIN
keyword. The body of a function closes with the END keyword,
equivalent to } in C#. Here is an example:
CREATE FUNCTION Addition()
RETURNS Decimal(6,3)
BEGIN
END
Optionally, you can type the AS keyword before
the BEGIN keyword:
CREATE FUNCTION Addition()
RETURNS Decimal(6,3)
AS
BEGIN
END
Between the BEGIN and END keywords, you
can define the assignment the function must perform. After performing this
assignment, just before the END keyword, you must specify the value
that the function returns. This is done by typing the RETURN keyword
followed by an expression. A sample formula is:
CREATE FUNCTION Addition()
RETURNS Decimal(6,3)
AS
BEGIN
RETURN Expression
END
Here is an example
CREATE FUNCTION GetFullName()
RETURNS varchar(100)
AS
BEGIN
RETURN 'Doe, John'
END
Practical
Learning: Creating a Function
|
|
- Change the code of the Database button as follows:
private void btnDatabase_Click(object sender, EventArgs e)
{
string strConnection =
"Data Source=(local);" +
"Database='UtilityCompany1';" +
"Integrated Security=yes;";
string CreateFunction = "CREATE FUNCTION EvaluateInvoice() " +
"RETURNS Decimal(8, 2) " +
"AS " +
"BEGIN " +
" RETURN 8.50 " +
"END;";
using (SqlConnection connection = new SqlConnection(strConnection))
{
SqlCommand command =
new SqlCommand(CreateFunction, connection);
connection.Open();
command.ExecuteNonQuery();
MessageBox.Show(
"A function named \"EvaluateInvoice\" has been created.");
}
}
- Execute the application
- To actually create the function, click the Database button
- Close the form and return to your programming environment
After a function has been created, you can use the value
it returns. Like a method in C#, using a function is also referred to as
calling it. To call a function, you must qualify its name. To do this, type
the name of the database in which it was created, followed by the period
operator, followed by dbo, followed by the period operator, followed
by the name of the function, and its parentheses. The formula to use is:
DatabaseName.dbo.FunctionName()
Because a function returns a value, you can use that
value as you see fit. For example, you can use SELECT to display the
function's value in a query window. Here is an example that calls the above
Addition() function:
SELECT Exercise.dbo.GetFullName();
Practical
Learning: Calling a Function
|
|
- On the form, double-click the Evaluate button
- Implement the event as follows:
private void btnEvaluate_Click(object sender, EventArgs e)
{
string strConnection =
"Data Source=(local);" +
"Database='UtilityCompany1';" +
"Integrated Security=yes;";
string ExecuteFunction = "SELECT dbo.EvaluateInvoice();";
using (SqlConnection connection = new SqlConnection(strConnection))
{
SqlCommand command =
new SqlCommand(ExecuteFunction, connection);
connection.Open();
SqlDataReader rdr = command.ExecuteReader();
while (rdr.Read())
{
txtAmountDue.Text = rdr[0].ToString();
}
rdr.Close();
}
}
- Execute the application and click the Evaluate button:
- Close the form and return to your programming environment
Because a function in Transact-SQL is treated as an
object, it may need maintenance. Some of the actions you would take include
renaming, modifying, or deleting a function.
If you create a function and execute it in Microsoft SQL
Server (Management Studio), it is stored in the Scalar-Valued Functions node
with the name you gave it. If you want, you can change that name but keep
the functionality of the function.
To rename a function, in the Object Explorer in
Microsoft SQL Server, right-click it and click Rename. Type the desired new
name and press Enter.
If you create a function and decide that you don't need
it any more, you can delete it.
To delete a function in the Object Explorer, locate the
function in the Functions section, right-click it and click Delete. The
Delete Object dialog box would come up. If you still want to delete the
function, click OK; otherwise, click Cancel.
To programmatically delete a function:
- In a query window, type DROP FUNCTION followed by the name of
the function and execute the statement
- In the Object Explorer, right-click the name of the function,
position the mouse on Script Function As, DROP To, and click New Query
Editor Window
- Open a new query window associated with the database that contains
the function. Display the Templates Explorer and expand the Function
node. Drag the Drop Function node and drop it in the empty query window
Practical
Learning: Deleting a Function
|
|
- On the form, double-click the Database button and change its code as
follows:
private void btnDatabase_Click(object sender, EventArgs e)
{
string strConnection =
"Data Source=(local);" +
"Database='UtilityCompany1';" +
"Integrated Security=yes;";
string CreateFunction = "DROP FUNCTION EvaluateInvoice;";
using (SqlConnection connection = new SqlConnection(strConnection))
{
SqlCommand command =
new SqlCommand(CreateFunction, connection);
connection.Open();
command.ExecuteNonQuery();
MessageBox.Show("A function named \"EvaluateInvoice\" has been deleted.");
}
}
- Execute the application and click the Database button
- Close the form and return to your programming environment
As mentioned already, in the body of the function, you
define what the function is supposed to take care of. As a minimum, a
function can return a simple number, typed on the right side of the
RETURN keyword. Here is an example:
CREATE FUNCTION Addition()
RETURNS int
BEGIN
RETURN 1
END
You can also declare new variables in the body of the
function to help in carrying the assignment. A variable declared in the body
of a function is referred to as a local variable. Once such a variable has
been declared, it can be used like any other variable. Here is an example:
CREATE FUNCTION Addition()
RETURNS int
BEGIN
DECLARE @Number1 int
SET @Number1 = 588
RETURN @Number1 + 1450
END
Like a method in C#, a function can be passed some
arguments. Put it another way, when you create a function, instead of, or in
addition to, local variables, you may want the code that will call the
function to provide the values needed to perform the assignment. An external
value that is provided to a function is called a parameter. A function can
also take more than one parameter. Therefore, when you create a function,
you also decide whether your function would take one or more parameters and
what those parameters, if any, would be.
We have already seen that a function's name is also
followed by parentheses. If the function doesn't use any argument, its
parentheses are left empty. If a function takes an argument, when you create
the function, you must specify a name and the type of value of the
parameters. The name of the parameter is created with the @ sign, like a
variable as we saw in the previous lesson. Here is an example:
CREATE FUNCTION Addition(@Number1 Decimal(6,2))
When a function takes a parameter, in the body of the
function, you can use the parameter as if you knew its value, as long as you
respect the type of that value. Here is an example:
CREATE FUNCTION Addition(@Number1 Decimal(6,2))
RETURNS Decimal(6,2)
BEGIN
RETURN @Number1 + 1450
END
Calling a Parameterized Function
|
|
When you call a function that takes one parameter, you
must supply a value for that argument. To do this, type the value of the
parameter in the parentheses of the function.
A Function With Various Arguments
|
|
Instead of only one parameter, you can also create a
function that takes more than one parameter. In this case, separate the
arguments in the parentheses of the function with a comma. Here is an
example:
CREATE FUNCTION Addition(@Number1 Decimal(6,2), @Number2 Decimal(6,2))
Once again, in the body of the function, you can use the
parameters as if you already knew their value. You can also declare local
variables and involve them with parameters as you see fit. Here is an
example:
CREATE FUNCTION Addition(@Number1 Decimal(6,2),
@Number2 Decimal(6,2))
RETURNS Decimal(6,2)
BEGIN
DECLARE @Result Decimal(6,2)
SET @Result = @Number1 + @Number2
RETURN @Result
END;
GO
When calling a function that takes more than one
parameter, in the parentheses of the function, provide a value for each
parameter, in the exact order they appear in the parentheses of the
function. Here is an example:
SELECT Variables1.dbo.Addition(1450, 228);
You can also pass the names of already declared and
initialized variables. Here is an example that calls the above function:
DECLARE @Nbr1 Decimal(6,2),
@Nbr2 Decimal(6,2)
SET @Nbr1 = 4268.55
SET @Nbr2 =26.83
SELECT @Nbr1 As First,
@Nbr2 As Second,
Variables1.dbo.Addition(@Nbr1, @Nbr2) AS Result
Practical
Learning: Creating and Calling a Function with Argument
|
|
- On the form, double-click the Database button and change its code as
follows:
private void btnDatabase_Click(object sender, EventArgs e)
{
string strConnection =
"Data Source=(local);" +
"Database='UtilityCompany1';" +
"Integrated Security=yes;";
// The following function is used to calculate the customer's next bill
// Some of the empty spaces, not required,
// are meant to make the code easier to read
string CreateFunction = "CREATE FUNCTION EvaluateInvoice(@Counter int) " +
"RETURNS decimal(6, 2) " +
"AS " +
"BEGIN " +
" DECLARE @BaseCharge money, " +
" @Counter0To50 int, " +
" @Counter50To150 int, " +
" @Counter150To200 int, " +
" @CounterOver200 int, " +
" @First50 decimal(6, 2), " +
" @FiftyTo150 decimal(6, 2), " +
" @OneFiftyTo200 decimal(6, 2) ," +
" @Over200 decimal(6, 2), " +
" @TotalCharge money; " +
" SET @BaseCharge = 8.50; " +
" SET @Counter0To50 = 0; " +
" SET @Counter50To150 = 0; " +
" SET @Counter150To200 = 0; " +
" SET @CounterOver200 = 0; " +
" SET @First50 = 0.00; " +
" SET @FiftyTo150 = 0.00; " +
" SET @OneFiftyTo200 = 0.00; " +
" SET @Over200 = 0.00; " +
" SET @TotalCharge = 0.00; " +
" IF @Counter <= 50 " +
" BEGIN" +
" SET @Counter0To50 = @Counter; " +
" SET @Counter50To150 = 0; " +
" SET @Counter150To200 = 0; " +
" SET @CounterOver200 = 0; " +
" END;" +
" IF (@Counter > 50) AND (@Counter <= 150) " +
" BEGIN" +
" SET @Counter0To50 = 50; " +
" SET @Counter50To150 = @Counter - 50; " +
" SET @Counter150To200 = 0; " +
" SET @CounterOver200 = 0; " +
" END;" +
" IF (@Counter > 150) AND (@Counter <= 300) " +
" BEGIN " +
" SET @Counter0To50 = 50; " +
" SET @Counter50To150 = 100; " +
" SET @Counter150To200 = @Counter - 150; " +
" SET @CounterOver200 = 0; " +
" END; " +
" IF @Counter > 300 " +
" BEGIN " +
" SET @Counter0To50 = 50; " +
" SET @Counter50To150 = 100; " +
" SET @Counter150To200 = 100; " +
" SET @CounterOver200 = @Counter - 300; " +
" END;" +
" SET @First50 = @Counter0To50 * 0.7675; " +
" SET @FiftyTo150 = @Counter50To150 * 0.6248; " +
" SET @OneFiftyTo200 = @Counter150To200 * 0.5825; " +
" SET @Over200 = @CounterOver200 * 0.5037; " +
" SET @TotalCharge = @BaseCharge + @First50 + @FiftyTo150 + " +
" @OneFiftyTo200 + @Over200; " +
" RETURN @TotalCharge; " +
"END;";
using (SqlConnection connection = new SqlConnection(strConnection))
{
SqlCommand command =
new SqlCommand(CreateFunction, connection);
connection.Open();
command.ExecuteNonQuery();
MessageBox.Show(
"A function named \"EvaluateInvoice\" has been created.");
}
}
- Change the code of the Evaluate button as follows:
private void btnEvaluate_Click(object sender, EventArgs e)
{
int StartCounter = 0, EndCounter = 0;
int Consumption;
try
{
StartCounter = int.Parse(txtCounterLastMonth.Text);
}
catch (FormatException)
{
MessageBox.Show("Invalid Start Counter");
}
try
{
EndCounter = int.Parse(txtCounterThisMonth.Text);
}
catch (FormatException)
{
MessageBox.Show("Invalid End Counter");
}
if (StartCounter > EndCounter)
{
MessageBox.Show("Invalid Values");
return;
}
Consumption = EndCounter - StartCounter;
string strConnection =
"Data Source=(local);" +
"Database='UtilityCompany1';" +
"Integrated Security=yes;";
string ExecuteFunction = "DECLARE @Difference int " +
"SET @Difference = " + Consumption.ToString() +
"SELECT dbo.EvaluateInvoice(@Difference);";
using (SqlConnection connection = new SqlConnection(strConnection))
{
SqlCommand command =
new SqlCommand(ExecuteFunction, connection);
connection.Open();
SqlDataReader rdr = command.ExecuteReader();
txtConsumption.Text = Consumption.ToString();
while (rdr.Read())
txtAmountDue.Text = rdr[0].ToString();
rdr.Close();
}
}
- Execute the application
- Click the Database button to create the function and click OK
- Enter some values for the start and end counter
- Click Evaluate. Here is an example:
- Close the form and return to your programming environment
- On the form, double-click the Database button and change the code of
its event as follows:
private void btnDatabase_Click(object sender, EventArgs e)
{
string strConnection =
"Data Source=(local);Integrated Security=yes";
using (SqlConnection connection = new SqlConnection(strConnection))
{
SqlCommand command =
new SqlCommand("DROP DATABASE UtilityCompany1;",
connection);
connection.Open();
command.ExecuteNonQuery();
MessageBox.Show("The UtilityCompany1 database has been deleted.");
}
}
- Execute the application
- Click the Database button
- Close the form and return to your programming environment
Functions and Permissions
|
|
The Right to Create Functions
|
|
If you are working in a large environment with many
users, you may not want all of them to add new functions to a database. In
fact, you can control who has the ability to create functions and who can
(only) execute them.
The primary permission of a function is named
CREATE FUNCTION. To visually allow a user to create functions,
access the Database Properties of the database. In the left frame, click
Permissions. In the Users or Roles list, click the user. In the Permissions
section, locate the Create Function row.
To programmatically grant the CREATE FUNCTION
permission, type it after the GRANT keyword and specify the
user after TO. Here is an example:
CREATE USER [Raymond Kouma]
FOR LOGIN rkouma;
GO
USE Exercise1;
GO
GRANT CREATE FUNCTION
TO rkouma;
GO
On the other hand, if you want to prevent a user from
creating functions, use the DENY operator. Here is an
example:
USE Exercise1;
GO
DENY CREATE FUNCTION
TO [Raymond Kouma];
GO
This would not allow a user to create a new function in
the designated database:
The Right to Execute Functions
|
|
If you work in a production environment, you may want to
have only some developers creating functions while the other people can only
execute or test the existing functions. To exercise that control, the
database is equipped with a permission named EXECUTE that
is associated with a function.
To programmatically grant the right to execute a
function, use the following formula:
GRANT EXECUTE ON OBJECT::[Schema.]FunctionName TO User
Start with the GRANT EXECUTE ON OBJECT::
expression. If you are using a Transact-SQL built-in function, you can omit
the schema. This is followed by the name of the function, TO,
and the name of the user. Here is an example:
GRANT EXECUTE
ON OBJECT::dbo.Addition
TO [Raymond Kouma];
GO
On the other hand, to prevent a user from executing a
function, deny the EXECUTE permission. Here is an example:
DENY EXECUTE
ON OBJECT::dbo.Addition
TO [Raymond Kouma];
GO
Introduction to Built-Functions
|
|
While your primary job as a database developer consists
of creating tables, probably your second most important job is to assist
your users with the various assignments they must perform on your
application. One way you can assist is to use functions that perform
otherwise complex tasks. To assist you, Transact-SQL provides a vast series
of read-made functions. If you use one of those functions, they must be
transmitted to the SQL interpreter. In some if not most cases, you can use
classes of the .NET Framework. This library is equipped with a very expanded
collection of classes that can assist you with almost any task. Since you
may be familiar with some of the .NET Framework classes but not with
Transact-SQL functions, we will review some of those here.
Because of their complexities, some values can be easily
recognized or fixed. For example, a date such as January 6, 1995 is constant
and can never change. This type of value is referred to as deterministic
because it is always the same. In the same way, a time value such as 5 PM is
constant and cannot change. There are other values that cannot be known in
advance because they change based on some circumstances. For example, the
starting date of the school year changes from one year to another but it
always occurs. This means that, you know it will happen but you don't know
the exact date. Such a value is referred to as non-deterministic.
To support determinism and non-determinism, Transact-SQL
provides two broad categories of functions. A function that always returns
the same or known value is referred to as deterministic. A function whose
returned value may depend on a condition is referred to as
non-deterministic.
Practical
Learning: Introducing Built-in Functions
|
|
- Create a new Windows Forms Application named Payroll
- From the Common Controls section of the Toolbox, add a Button to the
form
- Double-click the button and implement its Click event as follows:
private void button1_Click(object sender, EventArgs e)
{
string strConnection =
"Data Source=(local);Integrated Security=yes";
using (SqlConnection connection = new SqlConnection(strConnection))
{
SqlCommand command =
new SqlCommand("CREATE DATABASE Payroll;", connection);
connection.Open();
command.ExecuteNonQuery();
MessageBox.Show("A database named \"Exercise4\" has been created.");
}
}
- Execute the application
- Click the button
- Click OK
- Close the form and return to your programming environment
- Delete the button
In most cases, a value the user submits to your database
is primarily considered a string. This is convenient if that's what you are
expecting. If the value the user provides must be treated as something other
than a string, for example, if the user provides a number, before using such
a value, you should first convert it to the appropriate type, that is, from
a string to the expected type.
In a C# application, to convert a value, you can use
either the Convert class or a Parse()
method. In Transact-SQL, to convert a value, you can use either the
CAST() or the CONVERT() function. The syntax of the
CAST() function is:
CAST(Expression AS DataType)
The Expression is the value that needs to be
cast. The DataType factor is the type of value you want to convert
the Expression to. The DataType can be one of those we
reviewed in Lesson 4.
In the following example, two variables are declared and
initialzed as strings. Because they must be involved in a multiplication,
each is converted to a Decimal type.
Practical
Learning: Casting a Value
|
|
- Design the form as follows:
|
Control |
Text |
Name |
Other Properties |
Label |
Hourly Salary: |
|
|
TextBox |
0.00 |
txtHourlySalary |
TextAlign: Right |
Label |
Weekly Hours: |
|
|
TextBox |
0.00 |
txtWeeklyHours |
TextAlign: Right |
Button |
Calculate |
btnCalculate |
|
Label |
Weekly Salary: |
|
|
TextBox |
0.00 |
txtWeeklySalary |
TextAlign: Right |
Button |
Close |
btnClose |
|
|
- Double-click the Calculate button
- Return to the form and double-click the Close button
- Implement the events as follows:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace Exernamespace Payroll10
{
public partial class Exercise : Form
{
public Exercise()
{
InitializeComponent();
}
private void btnCalculate_Click(object sender, EventArgs e)
{
double HourlySalary = 0.00, WeeklyHours = 0.00;
try {
HourlySalary = double.Parse(txtHourlySalary.Text);
}
catch(FormatException)
{
MessageBox.Show("Invalid Weekly Hours");
}
try {
WeeklyHours = double.Parse(txtWeeklyHours.Text);
}
catch(FormatException)
{
MessageBox.Show("Invalid Weekly Hours");
}
string strConnection =
"Data Source=(local);" +
"Database='UtilityCompany1';" +
"Integrated Security=yes;";
string ExecuteFunction =
"DECLARE @StrSalary Varchar(10), " +
"@StrHours Varchar(6), " +
"@WeeklySalary Decimal(6,2) " +
"SET @StrSalary = '" + HourlySalary.ToString() + "'; " +
"SET @StrHours = '" + WeeklyHours.ToString() + "'; " +
"SET @WeeklySalary = CAST(@StrSalary As Decimal(6,2)) * " +
"CAST(@StrHours As Decimal(6,2)); " +
"SELECT @WeeklySalary;";
using (SqlConnection connection = new SqlConnection(strConnection))
{
SqlCommand command =
new SqlCommand(ExecuteFunction, connection);
connection.Open();
SqlDataReader rdr = command.ExecuteReader();
while (rdr.Read())
{
txtWeeklySalary.Text = rdr[0].ToString();
}
rdr.Close();
}
}
private void btnClose_Click(object sender, EventArgs e)
{
Close();
}
}
}
- Execute the application
- Enter a decimal value for the side and click the Calculate button.
Here is an example:
- Close the form and return to your programming environment
Like CAST(), the CONVERT() function is
used to convert a value. Unlike CAST(), CONVERT can be used to
convert a value from its original type into a non-similar type. For example,
you can use CONVERT to cast a number into a string and vice-versa.
The syntax of the CONVERT() function is:
CONVERT(DataType [ ( length ) ] , Expression [ , style ])
The first argument must be a known data type, such as
those we reviewed in Lesson 23.
If you are converting the value into a string (varchar, nvarchar, char,
nchar) or a binary type, you should specify the number of allowed characters
the data type's own parentheses. As reviewed for the CAST() function,
the Expression is the value that needs to be converted.
Practical
Learning: Converting a Value
|
|
- Start a new Windows Forms Application named Square10
- Design the form as follows:
|
Control |
Text |
Name |
Other Properties |
Label |
Side: |
|
|
TextBox |
0.00 |
txtSide |
TextAlign: Right |
Button |
Calculate |
btnCalculate |
|
Label |
Perimeter: |
|
|
TextBox |
0.00 |
txtPerimeter |
TextAlign: Right |
Button |
Close |
btnClose |
|
Label |
Area: |
|
|
TextBox |
0.00 |
txtArea |
TextAlign: Right |
|
- Double-click the Calculate button
- Return to the form and double-click the Close button
- Implement the events as follows:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace Exercise1
{
public partial class Exercise : Form
{
public Exercise()
{
InitializeComponent();
}
private void btnCalculate_Click(object sender, EventArgs e)
{
double dSide = 0.00;
try {
dSide = double.Parse(txtSide.Text);
}
catch(FormatException)
{
MessageBox.Show("Invalid Side Value");
}
string strConnection =
"Data Source=(local);" +
"Database='UtilityCompany1';" +
"Integrated Security=yes;";
string ExecuteFunction =
"DECLARE @Side As Decimal(10,3), " +
" @Perimeter As Decimal(10,3), " +
" @Area As Decimal(10,3); " +
"SET @Side = " + dSide.ToString() + "; " +
"SET @Perimeter = @Side * 4; " +
"SET @Area = @Side * @Side; " +
"SELECT CONVERT(varchar(10), @Perimeter, 10), " +
" CONVERT(varchar(10), @Area, 10);";
using (SqlConnection connection =
new SqlConnection(strConnection))
{
SqlCommand command =
new SqlCommand(ExecuteFunction, connection);
connection.Open();
SqlDataReader rdr = command.ExecuteReader();
while (rdr.Read())
{
txtPerimeter.Text = rdr[0].ToString();
txtArea.Text = rdr[1].ToString();
}
rdr.Close();
}
}
private void btnClose_Click(object sender, EventArgs e)
{
Close();
}
}
}
- Execute the application
- Enter a decimal value for the side and click the Calculate button.
Here is an example:
- Close the form and return to your programming environment
- Write a function named ProcessPayroll1 that takes the number of
hours worked in a week. Then the function returns a value that
represents overtime. If the employee worked less than 40 hours, there is
no overtime. If the employee worked for more than 40 hours, the number
over 40 is considered overtime
- Write a function named GetWeekdayName that, when given a date, can
find and display the name of the week for that date
- Write a function named GetNumberDays that takes two dates and
returns the number of days between them
- Write a function named AddNumberDays that takes a date and an
integer, then it returns the date added that number
|
|