Discuss technologies, mostly Microsoft, DotNet, C#, WCF, WPF, Silverlight, jQuery, AJAX, SQL Server, SharePoint, BizTalk, JavaScript, SOA, Design Pattern, UML, Agile, Oracle, messaging, etc.
Sunday, 26 February 2017
nodeJS and AngularJS
I haven't used Visual Studio and .Net as a development tool for more than 2 years now... instead, everyday is AngularJS, Node, and mySQL
Thursday, 29 January 2015
First Andriod App run on my Samsung Galaxy S5
Run "Hello World" on your Android Smartphone
1. Install Android Studio on your computer
2. Enable Developer options on S5
3. Download and install Samsung USB driver, you should see it as following in the Device Manager of your computer
5. Create a "Hello World" project in Android Studio
6. Run it and choose running device, and then [OK]
7. I got error:
pkg: /data/local/tmp/com.example.yourname.helloworld
Failure
[INSTALL_FAILED_OLDER_SDK]
The reason is that, in my Samsung phone, the version of API is 19, while in Android Studio, the minSdkVersion is set to 21. To change this, open build.gradle (Module: app), locate defaultConfig:
defaultConfig {
applicationId "com.example.yourname.helloworld"
minSdkVersion 21
targetSdkVersion 21
versionCode
1
versionName
"1.0"
}
Change it to:
defaultConfig {
applicationId "com.example.yourname.helloworld"
minSdkVersion 19
targetSdkVersion 21
versionCode
1
versionName
"1.0"
}
Run it again, I see "Hello world!" on my phone!
If you still get the same error, you can further lower the version number, make sure the minSdkVersion is not lower than the API version of your Android phone.
I ran it on my Samsung Galaxy S5, and I would assume the above steps would be very similar on other Android Phones.
Tuesday, 29 May 2012
Windows 7 tip: Change [Shut down] to [Sleep] at Start Menu
There are many times that I want to make my computer
sleep instead of shuting it down, so it would be more convenient to show the
sleep button rather than shut down at Start Menu. Here is the way how to do it:
Right Click the Taskbar and select Properties.
This will open up the "Taskbar and Start
Menu Properties".
Goto the "Start Menu" Tab
At Power button action, change it to Sleep,
click OK to save it
Tuesday, 13 March 2012
MVC 3 client side TextBox Validation
1. In the model, add attributes notation
[Required(ErrorMessage="name is required")]
public string Name { get; set; }
2. In the View, add the following before Html.BeginForm
<script src="../../Scripts/jquery.validate.min.js" type="text/javascript"></script>
<script src="../../Scripts/jquery.validate.unobtrusive.min.js"
type="text/javascript"></script>
@{ Html.EnableClientValidation(); }
3. Also in the View, add validation message beside your TextBox
<div class="FormInput">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
Sunday, 15 January 2012
MS SQL Server Isolation level explained
An isolation level determines the degree of data isolation between concurrent transactions. The default SQL
Server isolation level is Read Committed.
In the ascending order of isolation: Read
Uncommitted, Read Committed, Repeatable Read, Serializable.
Read uncommitted: dirty read,
you can read those that have been modified by other transaction but not yet
committed. It does not issue shared locks to prevent other transactions from
modifying data read by the current transaction.
Read committed: cannot read
data that has been modified but not committed by other transactions, this
prevents dirty reads. Data can be changed by other transactions between
individual statements within the current transaction, resulting nonrepeatable reads
or phantom data. Shared locks are only held for individual statements.
Repeatable read: cannot read
data that has been modified but not yet committed by other transactions and
that no other transactions can modify data that has been read by current
transaction until current transaction completes. Shared locks are placed on all
data read by each statement in the transaction and are held until the
transaction completes. This prevents other transactions from modifying any rows
that have been read by the current transaction. But other transactions can insert
new rows, so the query statement of current transaction could return unrepeatable
results. Shared locks are held to the end of a transaction instead of being
released at the end of each statement as READ COMMITTED.
Serializable: is the highest
level, where transactions are completely isolated from one another. It cannot
read data that has been modified but not yet committed by other transactions. No
other transactions can modify data that has been read by the current transaction
until the current transaction completes. Also, other transactions cannot insert
rows with key values that would fall in the range of keys read by any
statements in the current transaction until current transaction completes. Range
locks are placed in the range of key values that match the search conditions of
each statement executed in the transaction, this means that if any of the
statements in the current transaction are executed a second time, they will
read the same set of rows. The range locks are held until the transaction
completes.
A few ASP.NET, C# questions
Question: you
care building a setup for your application. The application contains a custom
control developed by you, which will be shared across multiple applications.
How should you package the custom control?
A: Package the control in a Merge Module (.msm) and add
the .msm file to a
Windows Installer project.
B: Package the control into a cabinet project (.cab) and
add the .cab file
to a Windows Installer project.
C: Create a separate directory for the control and then
package it in a
Windows Installer project along with the rest of the
project files.
D: Package the control as a Web setup project and create
a link to that
project from the Windows Installer project.
My answer: B
Question: If
you want to place a status bar control named 'statusBar1' at the bottom of your
windows Form, which of the following would be the correct property to set?
A. statusBar1.Dock = DockStyle.Bottom;
B. statusBar1.Lock = "Bottom";
C. Location(statusBar1) = DockStyle.Bottom;
D. statusBar1 = Placement.Down;
My answer: A
What namespaces
must you declare in order to use a SqlConnection object?
A. Import System.Data.Sql;
B. using System.Data.Sql;
C. using System.Data.SqlClient;
D. using Sql.Data;
My answer: C
Question: Which
type of DataSet is derived from the base DataSet class and then uses
information in an XML Schema file (.xsd file) in order to generate a new class?
A. Untyped DataSet
B. Typed DataSet
C. XML DataSet
D. XSD DataSet
My answer: B
You want to
accomplish the following with a Button Control:
1.) Add the button
2.) Add the Event Handler
3.) Trigger the event
which would be the correct segment of code to accomplish
these tasks?
A.
Button b = new Button(new EventHandler(onButtonAction));
b.clicked = True;
B.
Button b = new Button(new EventHandler(onButtonAction));
b.clicked(1);
C.
Button b = new Button();
b.Click += new ButtonEventHandler(onButtonAction);
b.PerformClick();
D.
Button b = new Button();
b.Click += new ButtonEventHandler(onButtonAction);
b.clicked = True;
My answer: C
Question: You
need to create a file name "File.txt" in the directory
"C:/data". How should you go about doing this?
A.
File fs = New File;
fs.Name = "File.txt";
fs.Directory = "C:/data";
fs.Create();
B.
FileStream fs =
File.Create("C:/data/File.txt");
C.
FileStream fs = New FileStream();
fs.Name = "File.txt";
fs.Directory = "C:/data";
fs.Create();
D.
Stream sw = File.Create("C:/data/File.txt");
My answer: B, but the directory must exists in advance
Which of the
following statements are TRUE about XML serialization?
I. XML serialization serializes only the public fields
and property values of an object into an XML stream.
II. XML serialization inlcude type information.
III. XML serialization requires a default
constructor to be declared in the class
that is to be serialized.
IV. XML serialization requires all properties that are to
be serialized as read/write properties. Read-only properties are not
serialized.
A. I
B. I and II
C. I, III and IV
D. All of the above
My answer: C
XML serialization by default doesn't serialize read-only
properties
It requires a parameterless constructor in order to allow
xml serialization to succeed
Question: The
following code is found in a windows Application:
this.openFileDialog1.Title = "Open File";
this.openFileDialog1.Filter = "Word Documents
(*.doc) | *.doc | Excel Spreadsheets (*.xls) | *.xls";
this.openFileDialog1.FilterIndex = 1;
this.openFileDialog1.CheckFileExists = true;
this.openFileDialog1.ShowReadOnly = false;
this.openFileDialog1.ShowDialog();
Which of the following statement is TRUE about this code
segment?
A. The code segment sets the Dialog Title to Open File
B. The code segment sets the default file type to Excel
Spreadsheets.
C. The code sets the File List box to Word documents and
Excel documents
D. A and C
E. All of the above
My answer: D
the code segment sets the default file type to Word
document
Question: Which of the statements below concerning literals is TRUE?
I. Data can be assigned to literals.
II. In certain cases, a suffix is added so that literals can perform the calculation in a much better way.
III. Strings can have many characters and are sometimes enclosed within double quotes.
a. I
b. II
c. I and II
d. I and III
e. all of above
My answer: e
update shared assembly
Shortly after releasing a new windows service, you discovered that there is a calculation error in a shared assembly the application uses. You corrected the error and are ready to install the new assembly on the client computers. how should you perform to quickly install your updated assembly?
My answer: Copy over the shared assembly and then use GACUTIL to install it into global assembly
?? null coalescing operator
.NET 3.5 questions:
Q1: What is the output of the following code?
A1:
int? indicates b and c are nullable types
Q2: what is the output of the following code?
Q1: What is the output of the following code?
int a = 20;
int? b = 30;
int? c = null;
Console.WriteLine(a + c ?? b);
result is 30
int? indicates b and c are nullable types
The result of 20+null is null.
?? operator checks whether the value of a+c is null, it returns a+c if it isn't null, returns b if it is null.
?? operator works for both reference and value types.
?? operator works for both reference and value types.
var s= "Hello";
s = 5;
s = 5++;
Console.WriteLine(s);
Cannot compile, error is "cannot implicitly convert
type 'int' to 'string'
Monday, 28 November 2011
How to debug in SQL 2008
I know there are some nice new features in SQL 2008, a few days ago, finally I got it all tried out and succeeded.
1. Set breakpoint in your Stored Procedure
This feature is only available in SQL 2008, not SQL 2005, and you need Debugger permission to do so. You can conveniently click the left side grey column to set the breakpoint in your stored procedure.
Then, open a new query window, write a statement to execute your stored procedure, provide parameters if necessary.
exec dbo.yourSpName @para1='value1', @para2='value2' .....
highlight the above statement, and click the debug icon next to Execute command at the toolbar, press F11 to step into the body of your stored procedure, also F10 to run the statement, you can check the values of all the variables in the context.
2. Add try-catch block
This is also new in SQL 2008, sample code is as following:
Log the error messages in your logTable, so you can examine them later to see what happened.
1. Set breakpoint in your Stored Procedure
This feature is only available in SQL 2008, not SQL 2005, and you need Debugger permission to do so. You can conveniently click the left side grey column to set the breakpoint in your stored procedure.
Then, open a new query window, write a statement to execute your stored procedure, provide parameters if necessary.
exec dbo.yourSpName @para1='value1', @para2='value2' .....
highlight the above statement, and click the debug icon next to Execute command at the toolbar, press F11 to step into the body of your stored procedure, also F10 to run the statement, you can check the values of all the variables in the context.
2. Add try-catch block
This is also new in SQL 2008, sample code is as following:
Log the error messages in your logTable, so you can examine them later to see what happened.
|
declare
@ErrorMessage varchar(MAX)
begin try
<your sql statements here ....>
end try
begin catch
select
@ErrorMessage = ERROR_MESSAGE()
EXEC [dbo].[log_Error]
@process_name
= 'your process name',
@user_message =
'Error occurred …',
@system_message = @ErrorMessage
end catch
|
Auto Increment Number in a single UPDATE statement
SQL Server 2005/2008
Suppose in a table, you want to increase the value of a Field (not identity field), you can write a SQL statement as following:
Update yourTable set yourField = max(yourField)+1 where .....
But, if the WHERE clause returns more than one records, then what you get is, for that more than one records, all the yourField will be update with the same value. If you want the yourField all has different value, you can write something like this:
Suppose in a table, you want to increase the value of a Field (not identity field), you can write a SQL statement as following:
Update yourTable set yourField = max(yourField)+1 where .....
But, if the WHERE clause returns more than one records, then what you get is, for that more than one records, all the yourField will be update with the same value. If you want the yourField all has different value, you can write something like this:
declare @max int
select @max= MAX(yourField) from yourTable
update yourTable set @max=yourField=@max+1 where ........
Tuesday, 23 August 2011
Inheritance and Polymorphism tips
The following example is demonstrated in C#
I have classB inherites from classA as following:
| class Program { static void Main(string[] args) { classB b = new classB(); classA a = b as classA; a.DoSomething(); b.DoSomething(); classB b2 = a as classB; b2.DoSomethingElse(); } public class classA { protected string s = "hello from classA"; public classA() { s = "hello from classA"; } public void DoSomething() { Console.WriteLine(s); } } public class classB : classA { protected string d = "something else"; public classB() { s = "hello from classB"; } public void DoSomethingElse() { Console.WriteLine(d); } } } |
The derived class - classB gains all the non-private data and behavior of the base class (classA) in addition to any other data or behaviors it defines for itself. classB is effectively both classB and classA (polymorphism).
When the program is run, both a.DoSomething() and b.DoSomething() output "hello from classB" to the Console, because when creating classB object, the Constructor of classA will be called before the Constructor of classB is called, so the value of s is "hello from classB".
When classB is cast to classA, classB is not changed by the cast, but the view of classB becomes restricted to classA's data and behavior. After casting classB to classA, that classA can be cast back to classB without losing the data. So when b2.DoSomethingElse() is invoked, it will output "something else"
Monday, 15 August 2011
Create InfoPath 2007 form and submit to SharePoint 2007
You should have InfoPath 2007 and SharePoint 2007 Standard or Enterprise installed and set up properly
1. Create an InfoPath Form Library in SharePoint 2007
Navigate to your top-level site collection, and then
Site Action | Create | Library | Form Library, name it as "InfoPathFormLibrary", note that
Document Template is Microsoft Office InfoPath form
2. InfoPathFormLibrary Settings | Form Library Settings | Advanced settings | Browser-enabled Documents | Display as a web page | OK
3. Enable InfoPath browser form features in SharePoint 2007
Site Actions | Site Settings | Site Collection Administration | Site Collection features
For SharePoint Enterprise edition, activate Office SharePoint Server Enterprise Site Collection features (Features include business data catalog, forms services, and Excel Services)
For SharePoint Standard edition, activate InfoPath Forms Services support
4. Configure InfoPath Forms Services
Central Administration | Application Management | InfoPath Forms Services | Configure InfoPath Forms Services
In the section of [User Browser-enabled Form Templates], select both Allow users to browser-enabled form templates and Render form templates that are browser-enabled by users, and click OK to save it.
5. Create a browser-compatible form template in InfoPath and publish to SharePoint 2007
Design a blank Form Template in InfoPath, and enable browser-compatible features
Layout | Table with title
Change the title to Customers, add a 2x2 table under Customers, it has two labels at the left column: Name and Address. Two TextBox at the right column.
6. Double click Name TextBox, and set Field name as name
Double click Address TextBox, and set Field name as address
7. Set submit options
Tools | Submit Options
Click Add to create data connection for submit. Follow the Data Connection Wizard.
my Document libary is: http://vm2/InfoPathFormLibrary
File name is the result of a function: concat("form",now()), you can click Fx button to build the function
Choose Allow overwrite if file exists
When you have completed the Data connection wizard and returned to the Submit Options window, click Advanced button, and choose Close the form after submit.
8. Set Form Options
Tools | Form Options...
Uncheck Show toolbar at bottom of from and click OK to save
9. Save this template
Click Save icon, name it as CustomerFormTemplate.xsn and save it in My Documents folder
10. Publish the templage
File | Publish, it invokes Publishing Wizard
On the following screen, do not click Add, click Next to go to Next step
Click Publish on the following screen
Close the wizard when success
11. Test the InfoPath form
Close InfoPath 2007.
Return to your site collection, click InfoPathFormLibrary at the quick launch.
New | New Document
you will see the InfoPath form in your browser
Submit the form when you're done.
12. You should be able to see it in the InfoPathFormLibrary
Monday, 8 August 2011
Create and publish Infopath Form to SharePoint 2010
Environment:
SharePoint 2010
InfoPath 2010
1. Navigate to the top level site and create a Custom List
Click 'Lists' from quick launch, then 'Create', name it as 'Customers'
and then go to List Tools | List and create three columns as 'Contact Name', 'Email' and 'Phone Number', make all of the fields 'Single line of text'
2. Open InfoPath Designer 2010, double-click the SharePoint List template. In the Data Connection Wizard, enter the URL of your top level site. For example, the URL I am using is:
http://win-4me5lbbsmh5/SitePages/Home.aspx
If the URL provide is not top level site, my experience is that InfoPath cannot establish the connection.
3. Click 'Next', choose 'Customize an existing SharePoint list', select 'Customers' and then click 'Next'
4. When finish, Infopath generates a form that maps to the fields of Customers list, you can do some customization and preview the changes you made, and then publish it to SharePoint by click the Quick Publish button (next to the Save icon at the top left of InfoPath)
5. To use the form in SharePoint, navigate to your sharepoint site and choose 'Edit Page' from 'Site Actions'
6. The Infopath Form will be display on the sharepoint page as a webpart. Click on the page at where you want the webpart being rendered. Then click Editing Tools | Insert | Web Part, select Forms in the Categories, InfoPath Form Web Part, and then click Add button to add the InfoPath Form webpart.
7. Select a Form. Click here to open the tool pane. In the 'List or Library' dropdown, select 'Customers' and click OK, you will see the InfoPath form on the page.
8. To use the InfoPath Form, click the Forms Edit Tab, fill out the form and click Save.
9. To see the data you just entered and saved. Go to Home, click Customers from quick launch.
Wednesday, 27 July 2011
CRUD with LINQ
Database: Northwind
Visual Studio 2010
Setup:
1. Create a new Web or WinForm Application
2. Create a new Data Connection in Server Explorer to connect to Northwind database
3. Add LINQ to SQL Classes to your project
4. Drag all the Northwind tables to the designer surface left panel, drag stored procedures CustOrderHist, CustOrdersDetails, CustOrdersOrders to the designer surface right panel. Actually I did not use all of those in the application.
5. Create a new stored procedure in the Northwind, name it as UpdateCustomer. Afterwards, I'll show you how to use LINQ to call this SP to update database and get the returned value. The SP is as following:
ALTER PROCEDURE [dbo].[UpdateCustomer] @CustomerID nchar(5), @CompanyName nvarchar(40) AS BEGIN SET NOCOUNT ON; update dbo.Customers set CompanyName = @CompanyName where CustomerID = @CustomerID return 1 -- for demo purpose END |
The SP updates the CompanyName of the Customers table based on the CustomerID, it takes two parameters: CustomerID and CompanyName. And always return value 1 for demo purpose here.
6. Refresh the database in Server Explorer and drag UpdateCustomer SP to the right panel of the Northwind.dbml designer surface.
7. Build the application, make sure it succeeded. The application looks like the following:
8. LINQ has generated the code to model the database, and we can start to enjoy the intellisense and strongly typed database object. The following is the code snippet:
Read Products with category name is "Beverages" |
NorthwindDataContext db = new NorthwindDataContext(); var products = from p in db.Products where p.Category.CategoryName=="Beverages" select p; foreach (Product p in products) { lblResult.Text = lblResult.Text + p.ProductName + " | "; } |
Update Products table |
NorthwindDataContext db = new NorthwindDataContext(); Product product = db.Products.Single(p => p.ProductName == "Chai"); product.UnitPrice = 99; product.UnitsInStock = 5; db.SubmitChanges(); |
Insert Records |
NorthwindDataContext db = new NorthwindDataContext(); Category cat = new Category(); cat.CategoryName = "TOY"; Product p1 = new Product(); p1.ProductName = "toy 1"; Product p2 = new Product(); p2.ProductName = "toy 2"; cat.Products.Add(p1); cat.Products.Add(p2); db.Categories.InsertOnSubmit(cat); db.SubmitChanges(); |
Delete |
NorthwindDataContext db = new NorthwindDataContext(); var toyProd = from p in db.Products where p.ProductName.Contains("toy") select p; db.Products.DeleteAllOnSubmit(toyProd); db.SubmitChanges(); |
Run SP, return a collection |
NorthwindDataContext db = new NorthwindDataContext(); var orderDetail = db.CustOrdersDetail(10248); foreach (CustOrdersDetailResult re in orderDetail) { Console.WriteLine(re.ProductName); } |
Note: When you use the object of CustOrdersDetailResult, you can see the intellisense and can access every Field the Stored Procedure CustOrdersDetailResult returns, that is ProductName, UnitPrice, Quantity, Discount and ExtendedPrice in this case. This SP is to return the order details based on the OrderID, which is passed as a parameter. |
Run SP, Update table and return a value |
NorthwindDataContext db = new NorthwindDataContext(); var result = db.UpdateCustomer("AAAAA", "BMW"); Console.WriteLine(result.ToString()); |
Note: UpdateCustomer is the new SP created at step 5. It sets the CompanyName to "BMW" for the CustomerID "AAAAA", Passing the parameter is like to call a regular method, and we do not need SubmitChanges here. In the SP, @CustomerID declared as nchar(5), @CompanyName declared as nvarchar(40), but in the intellisense, I see the signature changed to db.UpdateCustomer(string customerID, string companyName), need to watch not to exceed the width. |
Server side Pagination |
NorthwindDataContext db = new NorthwindDataContext(); var products = (from p in db.Products where p.Category.CategoryName.StartsWith("C") select p).Skip(200).Take(10); |
Pagination made easy, only returns the collection we are looking for. |
Subscribe to:
Posts (Atom)

























